【问题标题】:Can I typecast a Base to Derived interface type?我可以将 Base 类型转换为 Derived 接口类型吗?
【发布时间】:2012-05-02 14:02:02
【问题描述】:

我可以将基接口类型转换为派生接口吗?

我怎样才能像Delphi一样

Delphi 生成代码/Delphi 7:

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;

【问题讨论】:

    标签: delphi soap interface


    【解决方案1】:

    您的TBase 类目前没有实现IDerived,它只实现了IBase。 您的TDerived 类同时实现了IBase (通过从TBase 继承)IDerived (显式)

    你应该

    1. 将您的 TBase 声明更改为

      TBase =class(TInterfacedObject,IBase, IDerived)

      并在TBase 中实现IDerived 方法。

    2. 或将b:=TBase.Create;改为b:=TDerived.Create

    【讨论】:

    • 谢谢@Lieven。 Delphi是怎么做到这一点的,你知道吗?不知道以后会出类。
    • @zgn - 我不确定我是否理解你的评论。这是一个问题还是一个观察?
    • 实际上,我正在尝试类似于 Delphi 的代码。对于最顶层的 delphi 示例,您能说什么。
    • Delphi 使用 IXMLNode、IXMLCollectionList 基本接口。但是函数可以导出不同的类型。另一个例子:link。我想学习如何做到这一点?
    • 我没有看到您提供的链接有什么特别之处,但您必须记住,接口不能真正从对象继承。没错,IDerived 继承来自IBase 的方法签名,但这并不意味着实现IDerived 的对象也隐式实现IBase
    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多