지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;;
10. Interface Delegation
- IInterface1을 구현한 TObject1이 있다고하자. 만약, IInterface1 과 IInterface2 를 모두 사용하는 TCombinedObject의 경우 이미 TObject1에 의해 구현된 IInterface1를 소스카피와 같은 방법으로 다시 구현하여야할까? -> No. :)
- Delegation: 어떤 클래스가 다른 클래스의 포인터를 가지고 있음을 의미함.
- 델파이는 다른 클래스에 인터페이스의 구현부를 위임(delegate)할 수 있는 방법을 제공한다.
type
IInterface1 = interface
['{72B1C430-A021-11D3-B8AC-0040F67455FE}']
procedure DoIt1;
end;
IInterface2 = interface
['{72B1C431-A021-11D3-B8AC-0040F67455FE}']
procedure DoIt2;
end;
TObject1 = class(TInterfacedObject, IInterface1)
protected
procedure DoIt1;
end;
TCombinedObject = class(TInterfacedObject, IInterface1, IInterface2)
protected
FObj1: IInterface1;
public
constructor Create;
destructor Destroy; override;
procedure DoIt2;
property MyIntf: IInterface1 read FObj1 implements IInterface1; // - 1
end;
implementation
{ TObject1 }
procedure TObject.DoIt1;
begin
ShowMessage('Inside TObject.DoIt1');
end;
{ TCombinedObject }
constructor TCombinedObject.Create;
begin
inherited Create;
FObj1 := TObject1.Create;
end;
destructor TCombinedObject.Destory;
begin
FObj1:= nil;
inherited;
end;
procedure TCombinedObject.DoIt2;
begin
ShowMessage('Inside TCombinedObject.DoIt2');
end;
- 상기 코드에서 TObject1 클래스 내(內) IInterface1이 구현되어있다. TCombinedObject 는 TObject1 의 레퍼런스를 포함하여 IInterface1의 구현부를 FObj1로 위임(delegate)하도록 한다.(1을 통해...)
- 1에서의 implements 지시자는 작성하고있는 클래스 내(內) 인터페이스의 구현부를 property로 위임(delegate)하는 역할을 한다.
procedure TForm1.Button1Click(Sender: TObject);
var
I1: IInterface1;
I2: IInterface2;
begin
I2:= TCombinedObject.Create;
I2.DoIt2;
I1:= I2 as IInterface1;
I1.DoIt1;
end;
- 상기 코드는 TCombinedObject를 사용하기 위한 예이다.
- 비록 IInterface1이 TObject1에 의해 실질적으로 구현되어있으나, I2 as IInterface1 과 같이 사용하면 TCombinedObject 객체로부터 IInterface1을 자동으로 실행할 수 있다.
procedure TForm1.Button1Click(Sender: TObject);
var
I1: IInterface1;
I2: IInterface2;
CombinedObject: TCOmbinedObject;
begin
CombinedObject:= TCombinedObject.Create;
I2:= CombinedObject;
I2.DoIt2; // - 1
I1:= I2 as IInterface1;
I1.DoIt1; // - 2
CombinedObject.MyIntf.DoIt1; // - 3
end;
- 3은 2와 동일한 결과를 보여준다.
정리하다보니 여기까지 글이 존재하는군요. 지금 이 요약 #7 의 내용은 조금 미진하게 느껴집니다. ^^ 뭐 10년 전 한창 공부할때니...
반응형
'프로그래밍 > PC' 카테고리의 다른 글
Delphi XE2 에서 DataSnap REST Application Cross Domain 처리 (0) | 2012.06.20 |
---|---|
Delphi XE2, dbExpress Oracle 10g 연동 (1) | 2012.05.30 |
Interface 요약 #6 (0) | 2012.04.19 |
Interface 요약 #5 (0) | 2012.04.19 |
Interface 요약 #4 (0) | 2012.04.19 |
댓글