2

ベースインターフェイスを派生インターフェイスに型キャストできますか?

Delphiのようにするにはどうすればよいですか

Delphiで生成されたコード/Delphi7:

function TXMLBook.Get_Id: IXMLId;
begin
   Result := ChildNodes['id'] as IXMLId;
end;

ChildNodes['id']は基本タイプIXMLNodeです

IXMLIdはIXMLNodeから派生したタイプです

私のサンプルコードは:

type
IBase = interface(IInterface)
['{5CEA3668-36CB-444C-8D3E-06644070A2B4}']
  function Test:AnsiString;
end;

TBase =class(TInterfacedObject,IBase)
  function Test:AnsiString;
end;

IDerived =interface (IBase)
['{8CDB2982-43B0-4636-B6F5-2561C0D419A9}']
  function Test2: AnsiString;
end;

TDerived=class (TBase,IDerived)
  function Test:AnsiString;
  function Test2:AnsiString;
end;

{ TBase }

function TBase.Test: AnsiString;
begin
   Result:='Base Test';
end;

{ TDerived }

function TDerived.Test: AnsiString;
begin
  Result:='Derived Test';
end;

function TDerived.Test2: AnsiString;
begin
   Result:='Derived Test2';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  b:IBase;
  d: IDerived;
begin
  b:=TBase.Create;
  d:=b as IDerived; // Error : Interface not supported 

  ShowMessage(b.Test);
end;
4

1 に答える 1

3

TBase現在、クラスは実装していません。実装しIDerivedているだけIBaseです。クラスは(から継承することにより(明示的に)TDerivedの両方を実装します。IBase TBaseIDerived

あなたはどちらか

  1. TBase宣言をに変更します

    TBase =class(TInterfacedObject,IBase, IDerived)

    IDerivedのメソッドを実装しますTBase

  2. またはに変更b:=TBase.Create;b:=TDerived.Createます;
于 2012-05-02T14:06:48.263 に答える