델파이 인터페이스를 전혀 이해를 못하다가 Swift의 Protocol을 공부하면서 이해가 되었습니다. 물론 정확한지는 모르지만 제가 이해하는 수준입니다.
이론적 배경은 구글링을 하시면 어렵게 설명되어 있으니 시스템프로그램하시는 분은 그곳을 참고하시고 저는 사용하는 입장에서만...
Interface 가 도입된 배경은 Windows 32 시스템에서 COM을 사용하기 위한 것이고 지금은 COM을 사용하는 경우가 별로 없으니 GUID(Shift+Ctrl+G)는 생성할 필요는 없습니다.
먼저 다음과 같이 선언해보십시요.
type
iCalc = interface
function calcAdd(adx, bdx: integer): integer;
function calcMulti(adx, bdx: integer): integer;
end;
TiCalc = class(TInterfacedObject, iCalc)
function calcAdd(adx, bdx: integer): integer;
function calcMulti(adx, bdx: integer): integer;
end;
jCalc = interface
function calcSub(adx, bdx: integer): integer;
function calcDivide(adx, bdx: integer): integer;
end;
TjCalc = class(TiCalc, iCalc, jCalc)
function calcSub(adx, bdx: integer): integer;
function calcDivide(adx, bdx: integer): integer;
end;
iCalc = interface
function calcAdd(adx, bdx: integer): integer;
function calcMulti(adx, bdx: integer): integer;
end;
TiCalc = class(TInterfacedObject, iCalc)
function calcAdd(adx, bdx: integer): integer;
function calcMulti(adx, bdx: integer): integer;
end;
jCalc = interface
function calcSub(adx, bdx: integer): integer;
function calcDivide(adx, bdx: integer): integer;
end;
TjCalc = class(TiCalc, iCalc, jCalc)
function calcSub(adx, bdx: integer): integer;
function calcDivide(adx, bdx: integer): integer;
end;
구현은 Interface에서 하지 않고 Class에서 합니다.
TJCalc 가 다중상속되었슴에 주의하시면 되겠습니다.
사용은 아래그림 및 아래와 같이하고
procedure TForm1.Button1Click(Sender: TObject);
var adx: iCalc;
begin
adx:= TiCalc.Create;
Label1.Caption:= adx.calcAdd(2, 3).ToString;
//adx.free Not need
end;
procedure TForm1.Button2Click(Sender: TObject);
var adx: jCalc;
begin
adx:= TjCalc.Create;
Label1.Caption:= adx.calcDivide(40, 2).ToString;
//adx.free Not need
end;
procedure TForm1.Button3Click(Sender: TObject);
var adx: iCalc;
begin
adx:= TiCalc.Create;
Label1.Caption:= adx.calcAdd(40, 2).ToString;
//adx.free Not need
end;
var adx: iCalc;
begin
adx:= TiCalc.Create;
Label1.Caption:= adx.calcAdd(2, 3).ToString;
//adx.free Not need
end;
procedure TForm1.Button2Click(Sender: TObject);
var adx: jCalc;
begin
adx:= TjCalc.Create;
Label1.Caption:= adx.calcDivide(40, 2).ToString;
//adx.free Not need
end;
procedure TForm1.Button3Click(Sender: TObject);
var adx: iCalc;
begin
adx:= TiCalc.Create;
Label1.Caption:= adx.calcAdd(40, 2).ToString;
//adx.free Not need
end;
Button3에서는 TjCalc에서 구현하지 않은 상속받은 calcAdd 메소드를 사용했습에 주의하십시요.
결국 스위시의 프로토콜처럼 어떤 객체에 반드시 구현되어야 할(앞으로 사용 할 것임을 알리는?) 메소드를 먼저 선언한게 아닐까? 사용시에는 이것(Interface)만 보면 되겠지요.
댓글 없음:
댓글 쓰기