介面的繼承

介面可以相互繼承,就像類一樣。因此,實現類必須實現介面和所有基介面的功能。但是,這樣,編譯器不知道實現類也實現了基介面,它只知道明確列出的介面。這就是為什麼在 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;