2013-05-22 66 views
3

我有兩個接口,一個從antoher得出:接口多態性在Delphi

type 
    ISomeInterface = interface 
    ['{5A46CC3C-353A-495A-BA89-48646C4E5A75}'] 
    end; 

    ISomeInterfaceChild = interface(ISomeInterface) 
    ['{F64B7E32-B182-4C70-A5B5-72BAA92AAADE}'] 
    end; 

現在我有一個過程,它的參數是ISomeInterface這樣的:

procedure DoSomething(SomeInterface: ISomeInterface); 

我要檢查,如果SomeInterface是ISomeInterfaceChild。 Is運算符在Delphi 7的接口中不受支持,我也不能在這裏使用Supports。我能做什麼?

回答

5

你確實可以使用Supports。所有你需要的是:

Supports(SomeInterface, ISomeInterfaceChild) 

這個程序說明:

program SupportsDemo; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

type 
    ISomeInterface = interface 
    ['{5A46CC3C-353A-495A-BA89-48646C4E5A75}'] 
    end; 

    ISomeInterfaceChild = interface(ISomeInterface) 
    ['{F64B7E32-B182-4C70-A5B5-72BAA92AAADE}'] 
    end; 

procedure Test(Intf: ISomeInterface); 
begin 
    Writeln(BoolToStr(Supports(Intf, ISomeInterfaceChild), True)); 
end; 

type 
    TSomeInterfaceImpl = class(TInterfacedObject, ISomeInterface); 
    TSomeInterfaceChildImpl = class(TInterfacedObject, ISomeInterface, ISomeInterfaceChild); 

begin 
    Test(TSomeInterfaceImpl.Create); 
    Test(TSomeInterfaceChildImpl.Create); 
    Readln; 
end. 

輸出

 
False 
True 
4

你爲什麼說你不能使用Supports功能?這似乎是解決方案,它有一個重載的版本這需要IInterface作爲第一個參數,以便

procedure DoSomething(SomeInterface: ISomeInterface); 
var tmp: ISomeInterfaceChild; 
begin 
    if(Supports(SomeInterface, ISomeInterfaceChild, tmp))then begin 
    // argument is ISomeInterfaceChild 
    end; 

應該做你想要什麼。

+0

如果只需要檢查接口是否支持'ISomeInterfaceChild',那麼你正在使用錯誤的過載。你應該使用兩個參數重載,正如我在答案中所演示的那樣。 –

+0

好吧,我假設如果你需要檢查參數ISomeInterfaceChild,你還需要使用它作爲ISomeInterfaceChild。另外檢查不太有意義,這應該不重要,因此檢查它可能表明設計問題。 – ain

+1

@ain:不一定。有時候接口被用來宣傳關於包含對象的特性,而實際上並沒有爲它們公開新的功能。在這種情況下,只需檢查是否存在支持的接口就足夠了。 –