본문 바로가기
프로그래밍/PC

Interface 요약 #7

by 사악신 2012. 4. 19.

지금으로부터 무려 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

댓글