2012년 11월 6일 화요일

인터페이스(Interface) 이해(2)


인터페이스(Interface) 이해(1) 에서 Unit 간의 결합을 약하게 하기 위하여 Virtual; Abstract; 를 사용하였습니다.

인터페이스를 사용하여 구현해 보도록 하겠습니다.

1. 먼저 콘솔 프로젝트를 생성합니다.
2. 유니트를 하나 추가 하고 인터페이스를 선언 합니다.
    인터페이스에는 필드가 없고 전부 Public 입니다.
unit Unit4;
interface
type
  iMyInterface= interface
  ['{FEB663D2-1CCF-42E6-8429-049D97DC129E}'] // Vtrl + Shift + G
    function GetQuestion: string;
    procedure SetQuestion(const Value: string);
    function Answer: string;
    property Question: string read GetQuestion write SetQuestion;
  end;
implementation
end.

3. 구현 클래스를 만듭니다.
unit Unit5;
interface
uses Unit4;
type TMyClass = class(TInterfacedObject, iMyInterface)
    FQuestion: string;
  private
    function GetQuestion: string;
    procedure SetQuestion(const Value: string);
  public
    function Answer: string;
    property Question: string read GetQuestion write SetQuestion;
end;
implementation
{ iMyClass }
function TMyClass.Answer: string;
begin
  Result:= 'Your Question is ' + FQuestion + '.';
end;
function TMyClass.GetQuestion: string;
begin
  Result:= fQuestion;
end;
procedure TMyClass.SetQuestion(const Value: string);
begin
  FQuestion:= Value;
end;
end.

4. 앞 설명과 일관성을 유지하기 위하여 생성 부분을 분리하였습니다.
unit Unit6;
interface
uses Unit4, Unit5;
function CreateObj: iMyInterface;
procedure FreeObj(Obj: iMyInterface);
implementation
function CreateObj: iMyInterface;
begin
  Result:= TmyClass.Create;
end;
procedure FreeObj(Obj: iMyInterface);
begin
  Obj:= nil;
end;
end.

5. Project3 부분을
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils,
  Unit4 in 'Unit4.pas',
  // Unit5 in 'Unit5.pas',
  Unit6 in 'Unit6.pas';
var
  iMyInf: iMyInterface;
begin
  iMyInf:= CreateObj;
  iMyInf.Question:= 'Hello!';
  writeln(iMyInf.Answer);
  readln;
  FreeObj(iMyInf);
end.
6 생성 부분과 해제 부분이 틀립니다. // 역시 구현 부분이 프로젝트 부분과 분리되어 있으며, 해제 부분에서 에러가 발생하지 않습니다. 앞의 (1) 설명에서 해제 부분에서 에러가 발생함.


댓글 없음:

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.