-1

我有两节课。一个抽象 (XmlNodeManager) 和您的具体子 XmlEnpManager。抽象类定义是:

type
  TXmlNodeManager = class
    public
      constructor Create(aRoot: IXMLNode); virtual; abstract;
      function Size(): Integer;
   protected
      { sgy alias para strategy }
      sgyIterator: Integer;
      sgyAttributes: TStringList;
      sgyRoot: IXMLNode;
  end;

并且,子类:

type
  TXmlEnpManager = class (TXmlNodeManager)
    public
      constructor Create(aRoot: IXMLNode); override;
  end;

构造函数在子类中实现,并具有以下代码:

constructor TXmlEnpManager.Create(aRoot: IXMLNode);
begin
  sgyIterator := 0;
  sgyRoot := aRoot;
  Self.GenerateAttribs;
end;

而该 size() 方法是在父亲中实现的:

function TXmlNodeManager.Size(): Integer;
begin
  Size := sgyRoot.ChildNodes.Count;
end;

当我创建 XmlEnpManager 的实例,并将定义的 IXMLNode 作为参数传递,并发送 Size() 消息时。程序因 sgyRoot.ChildNodes.Count 上的访问冲突而失败(在执行时)。

我做下一个检查:

function TXmlNodeManager.Size(): Integer;
begin
  if (Assigned(sgyRoot)) then
    ShowMessage('Root assigned.')
  else
    ShowMessage('Root not assigned ???');
end;

显示第二个警报。我在 Delphi 中是最新的,并且怀疑接口引用是按值引用的,与对象不同。是正确的 ?。如何解决这个问题?有任何想法吗 ?。

编辑:我做向下铸造。我有一个 XmlNodeManager 类型的变量,它使用 XmlNodeManager 的子类进行初始化。这是对的 ?。例子:

// aNode can be a instance of TXmlEnpManager or another subclass of TXmlNodeManager.
procedure TXmlFileManager.SetCurrentNode(aNode: TXmlNodeManager);
    begin
      // xmCurrentNode is of TXmlNodeManager type
      xmCurrentNode := aNode;
    end;
4

1 回答 1

0

如果我没记错的话,你应该从你的构造函数中调用继承的构造函数:

constructor TXmlEnpManager.Create(aRoot: IXMLNode);
begin
  INHERITED Create;
  sgyIterator := 0;
  sgyRoot := aRoot;
  Self.GenerateAttribs;
end;
于 2013-08-16T05:06:56.340 回答