인터페이스(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) 설명에서 해제 부분에서 에러가 발생함.
댓글 없음:
댓글 쓰기