2

기본 인터페이스 유형의 변수에 클래스를 할당 할 수없는 이유는 무엇입니까?기본 인터페이스 유형의 변수에 TMyClass 객체를 할당 할 수 없습니다.

IInt1 = interface 
    procedure Test1; 
end; 

IInt2 = interface(IInt1) 
    procedure Test2; 
end; 

TCustomClass = class(TInterfacedObject) 
end; 

TMyClass = class(TCustomClass, IInt2) 
    procedure Test1; 
    procedure Test2; 
end; 

var 
    Obj: IInt1; 
begin 
    Obj := TMyClass.Create; // <!-- E2010 Incompatible types: 'IInt1' and 'TMyClass' 
    ... 
end; 


E2010 Incompatible types: 'IInt1' and 'TMyClass' 

컴파일러의 버그 또는 간단하지 허용 동작이된다

우리는 다음이 고려하십시오. 이 문제를 해결할 수 있습니까?

답변

2

는 선언에 구현 된 인터페이스의 목록에서 IInt1 포함 :

TMyClass = class(TCustomClass, IInt1, IInt2) 
end; 
+0

처럼 보일 것입니다. 클래스는 구현 된 인터페이스를 명시 적으로 지정해야합니다. 이것은 방법과 관련이 있습니다. 서로 다른 인터페이스 버전이 쿼리됩니다. –

0

다음과 같이 세 가지 오류가 위가 있습니다

  1. 클래스 선언 인터페이스에 필요한 모든 구성원을 포함해야합니다. 따라서 TMyClass에는 Test1 및 Test2 프로 시저가 정의되어 있어야합니다.
  2. 인터페이스에는 아래 코드와 같이 GUID가 있어야합니다. GUID를 표시 할 위치에 커서를 놓고 CTRL-SHIFT-G를 눌러 IDE를 생성합니다.
  3. 새 클래스를 할당 할 때 유형 변환에 AS 키워드를 사용해야합니다. 인터페이스 상속은 인터페이스입니다 :

코드 스 니펫 따라서, 그 외에도이

IInt1 = interface 
    ['{218BE5BB-0784-4E4A-923C-F1F1E116F38B}'] 
    procedure Test1; 
end; 

IInt2 = interface(IInt1) 
    ['{635D00B2-AC59-43A9-A7DB-660F53EBCDD8}'] 
    procedure Test2; 
end; 

TCustomClass = class(TInterfacedObject) 
private 
    procedure Test1; 
end; 

TMyClass = class(TCustomClass, IInt2) 
private 
    procedure Test2; 
end; 

... 

var 
    Obj: IInt1; 
begin 
    Obj := TMyClass.Create AS IInt1; 
    ... 
+2

인터페이스에는 GUID가 필요하지 않습니다. 직접 또는 간접적으로 ('Supports') QueryInterface 메서드를 사용하거나 COM 인터페이스를 원할 경우에만 필요합니다. 따라서 Interface에는 GUID가 있지만 필수는 아닙니다. 또한 AS 연산자가 필요하지 않습니다. 컴파일러는 "타입 캐스트"를 올바르게 수행 할 수 있습니다. –

관련 문제