接口的继承

接口可以相互继承,就像类一样。因此,实现类必须实现接口和所有基接口的功能。但是,这样,编译器不知道实现类也实现了基接口,它只知道明确列出的接口。这就是为什么在 TImplementer 上使用 as ISuperInterface 是行不通的原因。这也导致了通常的做法,即明确实现所有基接口(在本例中为 TImplementer = class(TInterfacedObject, IDescendantInterface, ISuperInterface))。

ISuperInterface = interface
    ['{A2437023-7606-4551-8D5A-1709212254AF}']
    procedure Method1();
    function Method2(): Boolean;
end;

IDescendantInterface = interface(ISuperInterface)
    ['{6C47FF48-3943-4B53-8D5D-537F4A0DEC0D}']
    procedure SetValue(const aValue: TObject);
    function  GetValue(): TObject;

    property Value: TObject read GetValue write SetValue;
end;

TImplementer = class(TInterfacedObject, IDescendantInterface)
    // ISuperInterface
    procedure Method1();
    function Method2(): Boolean;

    // IDescendantInterface
    procedure SetValue(const aValue: TObject);
    function  GetValue(): TObject

    property Value: TObject read GetValue write SetValue;
end;