¿Por qué mi clase implementa interfaces secundarias, pero no sus padres?

Encontré un comportamiento inesperado (al menos para mí) al usar la herencia de interfaz en Delphi.

Tengo esta jerarquía simple de clase e interfaz:

+---------------+
| << IMyBase >> |
+---------------+
        ^
        |
+---------------+
| << IMyIntf >> |
+---------------+
        ^
        |
   +---------+
   | TMyObj  |
   +---------+

Quería declarar una variable de tipoIMyBase. Crear unTMyObj y asignarlo a mi variable. IHMO esta es una práctica normal de OOP. Pero resultó que no se compila.

También he tratado de declarar una variable de tipoIMyIntf y verifique si es compatible conIMyBase, En mi humilde opinión debería apoyarlo, pero no lo hace.

Aquí hay un código de prueba simple:

program interface_inheritance;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  IMyBase = interface
    ['{CC7C61B8-3FBA-481F-AF0D-A93C603B5202}']
    procedure Hello;
  end;

  IMyIntf = interface(IMyBase)
    ['{01CE01D9-A753-431C-A30E-64BAEC6C4E26}']
    //
  end;

  TMyObj = class(TInterfacedObject, IMyIntf)
    procedure Hello;
  end;

{ TMyObj }

procedure TMyObj.Hello;
begin
  Writeln('Hello World');
end;

var
  b: IMyBase;
  i: IMyIntf;
begin
(*  // Compile Error E2010
  b := TMyObj.Create;
  b.Hello;*)

  // Does not work as Expected
  // Does not call Hello()
  i := TMyObj.Create;
  if Supports(i, IMyBase, b) then begin
    // Why does i not support IMyBase ??
    b.Hello;
  end;

  // Works but unsafe!
  // Hard cast, without check.
  i := TMyObj.Create;
  b := IMyBase(i);
  b.Hello;

  // Works, of course!
  i := TMyObj.Create;
  i.Hello;

  Readln;
end.

Como puede ver, tengo una estructura de clase / interfaz válida. pero algunas partes no se compilan. y algunos no se ejecutan como se esperaba.

Por queb := TMyObj.Create; dar un error de tipo incompatible?Por queSupports(i, IMyBase, b) devolucionesfalse? ¿Hay otra (mejor) forma de resolver este problema? sin un yeso duro sin cheque? if i is IMyBase no funciona, porque las interfaces no admitenis operador.)

¿Es este comportamiento válido de Pascal / Delphi o un error? EN MI HUMILDE OPINIÓNSupports() debería devolvertrue. yTMyObj debe ser un @ váliIMyBase (y por lo tanto se puede asignar).

Respuestas a la pregunta(1)

Su respuesta a la pregunta