实例变量访问冲突

时间:2013-08-15 23:36:33

标签: delphi interface reference

我有两节课。一个抽象(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作为param传递时,发送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;

1 个答案:

答案 0 :(得分:0)

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

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