如果我有以下接口和一个实现它们的类 -
IBase = Interface ['{82F1F81A-A408-448B-A194-DCED9A7E4FF7}']
End;
IDerived = Interface(IBase) ['{A0313EBE-C50D-4857-B324-8C0670C8252A}']
End;
TImplementation = Class(TInterfacedObject, IDerived)
End;
Run Code Online (Sandbox Code Playgroud)
以下代码打印'Bad!' -
Procedure Test;
Var
A : IDerived;
Begin
A := TImplementation.Create As IDerived;
If Supports (A, IBase) Then
WriteLn ('Good!')
Else
WriteLn ('Bad!');
End;
Run Code Online (Sandbox Code Playgroud)
这有点烦人但可以理解.支持无法转换为IBase,因为IBase不在TImplementation支持的GUID列表中.可以通过将声明更改为 - 来修复
TImplementation = Class(TInterfacedObject, IDerived, IBase)
Run Code Online (Sandbox Code Playgroud)
然而,即使没有这样做,我已经知道 A实现了IBase,因为A是IDerived,而IDerived是IBase.所以,如果我遗漏支票,我可以投A,一切都会好的 -
Procedure Test;
Var
A : IDerived;
B : IBase;
Begin
A := TImplementation.Create As IDerived;
B := IBase(A);
//Can now successfully call any of B's methods …Run Code Online (Sandbox Code Playgroud) 我想初始化一个这样的数组 -
Const MyArray : Array[0..0] Of TGUID = (IInterface);
Run Code Online (Sandbox Code Playgroud)
但它导致 -
[DCC Error] Test.pas(10): E2010 Incompatible types: 'TGUID' and 'string'
Run Code Online (Sandbox Code Playgroud)
那么看看会发生什么我试过这个 -
Const MyArray : Array[0..0] Of String = (IInterface);
Run Code Online (Sandbox Code Playgroud)
结果就是这个!
[DCC Error] Test.pas(10): E2010 Incompatible types: 'string' and 'TGUID'
Run Code Online (Sandbox Code Playgroud)
多么奇怪!当然,IInterface是一个或另一个,但它似乎顽固地转变为错误的类型.