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;
答案 0 :(得分:0)
如果我没弄错,你应该从构造函数中调用继承的构造函数:
constructor TXmlEnpManager.Create(aRoot: IXMLNode);
begin
INHERITED Create;
sgyIterator := 0;
sgyRoot := aRoot;
Self.GenerateAttribs;
end;