Когда класс реализует интерфейс потомка, почему он автоматически не считается реализующим базовый интерфейс?

По какой причине это не компилируется?

type
  IInterfaceA = interface ['{44F93616-0161-4912-9D63-3E8AA140CA0D}']
    procedure DoA;
  end;

  IInterfaceB = interface(IInterfaceA) ['{80CB6D35-E12F-462A-AAA9-E7C0F6FE0982}']
    procedure DoB;
  end;

  TImplementsAB = class(TSingletonImplementation, IInterfaceB)
    procedure DoA;
    procedure DoB;
  end;

var
  ImplementsAB: TImplementsAB;
  InterfaceA: IInterfaceA;
  InterfaceB: IInterfaceB;
begin
  ImplementsAB := TImplementsAB.Create;
  InterfaceA := ImplementsAB; >> incompatible types
  ...
end

В отличие от этого, я делаю так, чтобы это работало:

InterfaceA := ImplementsAB as InterfaceB;

или

InterfaceA := InterfaceB;

То есть, если IInterfaceB наследуется от IInterfaceA, а TImplementsAB реализует IInterfaceB, не логично было бы также реализовать IInterfaceA и быть совместимым по типу?

18
задан Rob Kennedy 12 December 2011 в 13:11
поделиться