지금으로부터 무려 10년전인 2002년 5월경, 델마당 개인게시판에 올렸던 총 9회의 글입니다. 유실된 줄 알았는데 싸이월드 게시판에 있는 걸 확인하고 복구합니다.;;
7. Interface의 포인터 획득하기
var
MyInteger: TFormattedInteger;
MyNumber: IFormattedNumber;
begin
MyInteger:= TFormattedInteger.Create(12);
MyNumber:= MyInteger;
end;
- 컴파일시 정적으로 할당됨(만약, 객체가 해당 인터페이스를 지원하지 않으면 컴파일시 에러발생)
var
MyObject: TObject;
MyNumber: IFormattedNumber;
begin
MyObject:= TFormattedInteger.Create(12);
// ...(중략)...
if MyObject.GetInterface(IFormattedNumber, MyNumber) then
ShowMessage(MyNumber.FormattedString);
end;
- GetInterface를 사용, 동적으로 인터페이스를 지원하는지 여부를 확인한 후 할당함.
function TObject.GetInterface(const IID: TGUID; out Obj): Boolean;
- IID: 포인터를 얻기 위한 인터페이스의 GUID
- 지원 여부 결과를 참, 거짓으로 반환함
- 참이면 Obj 파라미터로 인터페이스의 포인터를 돌려줌
var
MyObject: TObject;
MyNumber: IFormattedNumber;
begin
MyObject:= TFormattedInteger.Create(12);
//...(중략)...
MyNumber:= MyObject as IFormattedNumber;
ShowMessage(MyNumber.FormattedString);
end;
- 해당 객체가 인터페이스를 지원하지 않으면 참, 거짓 대신 예외를 발생시킨다.
procedure DoSomethingWithObject(O: TObject);
var
MyNumber: IFormattedNumber;
begin
if O.GetInterface(IFormattedNumber, MyNumber) then
ShowMessage(MyNumber.FormattedString);
end;
procedure DoSomethingWithInterface(I: IUnknown);
var
MyNumber: IFormattedNumber;
begin
ShowMessage((I as IFormattedNumber).FormattedString);
end;
- GetInterface는 TObject의 메쏘드(멤버함수)이기 때문에 객체 이외의 순수한 인터페이스에는 사용할 수 없다. 반면 as 연산자는 객체와 IUnknown 만을 상속받은 인터페이스에 모두 사용할 수 있다.
- GetInterface와 as는 인터페이스에 GUID가 있는 경우에만 사용할 수 있다
- 만약 GUID가 없는 Interface를 GetInterface 로 사용한 경우, Operator not applicable to this operand type 에러를 발생한다.
- 만약 GUID가 없는 Interface를 as 로 사용한 경우, Interface 'IFormattedNumber' has no interface identification 에러를 발생한다.
반응형
'프로그래밍 > PC' 카테고리의 다른 글
Interface 요약 #6 (0) | 2012.04.19 |
---|---|
Interface 요약 #5 (0) | 2012.04.19 |
Interface 요약 #3 (0) | 2012.04.19 |
Interface 요약 #2 (0) | 2012.04.19 |
Interface 요약 #1 (0) | 2012.04.19 |
댓글