我有两节课。一个抽象 (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;