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

标签 object freepascal delphi

我有父对象

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/

相关文章:

pascal - 如何使用 pascal 在数组中使用插入排序

pascal - 如何修复退出代码 201?

javascript - Javascript 对象中不平等的度量

javascript - jQuery 对象不起作用

javascript - 未捕获的类型错误 : Object #<object> has no method 'method'

delphi - 如何从TByteArray类型获取数组作为TByteArray类型较大数组的一部分?

multithreading - 仅按需从 TThread 动态初始化和调用 LoadLibrary 一次

xml - 导出到 Excel - 中间文件格式?

delphi - 从 C 头文件自动创建 Delphi/Freepascal 接口(interface)单元

javascript - 如何获取对象数组中某些特定属性的重复值的计数并将其存储在对象中