gpt4 book ai didi

object - Pascal 中的父对象和子对象

转载 作者:行者123 更新时间:2023-12-03 19:39:46 26 4
gpt4 key购买 nike

我有父对象

type PNode=^Node;
Node=Object
Left,Right:PNode;
Balance:integer;
Function Is_Greater(Node1:PNode);
end;

和对象节点的子对象
Type ChildNode=object(Node);
X:integer;
end;

我有 2 个指针 P,Q:PNode 并使用命令
P^:=Q^;

但它不会改变节点 P 的 X 值。
有没有办法可以做到这一点,而不使用指向子对象的指针?

最佳答案

使用您在子级中覆盖的虚拟方法。

 type 
PNode = ^TNode;
TNode = object
Constructor Init;
procedure assign(t:pNode); virtual;
end;

PChildNode=^TChildNode;
TChildNode = Object(TNode)
x:integer;
procedure assign(t:pNode); virtual;
end;


Constructor TNode.Init;
begin
end;
procedure TNode.Assign(t:pNode);
begin
// assign the tnode fields in t to the fields of self
end;

procedure TChildNode.Assign(t:pNode);
begin
inherited Assign(t); // parent's fields first
// we don't have Delphi's "IS" here, so can't test if t really is a pchildnode.
x:=pchildnode(t)^.x;
end;

function CreateChildNode(x:integer):PNode;
var chld : pChildNode;
begin
chld:=new(PChildNode,Init); chld^.x:=x;
createchildnode:=chld;
end;

// below this no knowledge of TChildnode except for printing.
var p1,p2 : PNode;

begin
p1:=createchildnode(10);
p2:=createchildnode(5);
// p2^ must be equal to P1^ or derive from it.
// See comment in TChildNode.assign
p1^.assign(p2);
writeln(pchildnode(p1)^.x);
end.

请注意,在等效的 Delphi 方言 (CLASS) 代码中,您可以使用 应该 使用,您可以使用 测试 assign 的传入元素是否真的是 tchildnode是 运算符(operator)

查看 FPC 的 packages/tv 和 objects 单元来源是学习旧 TP 方言的好资源。

关于object - Pascal 中的父对象和子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32510207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com