2013-05-22 2 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'. Othervise проверка не имеет смысла, это не имеет значения, и, таким образом, проверка на это может указывать на проблему с дизайном. – ain

+1

@ain: Не обязательно. Иногда интерфейсы используются для рекламы характеристик об содержащем объекте без фактического раскрытия им новых функций. В этом случае достаточно просто проверить наличие поддерживаемого интерфейса. –

Смежные вопросы