2015-09-05 45 views
0

我一直在研究AVL树单元,用户可以在其中指定他想要的内部树。我为此使用对象。在我的单元中,我定义了名为Node的父对象,并且指向此对象的指针是PTNode。在这个对象中,我有3个属性:Balance:integer; Left,Right:节点的子节点的PTNode,以及1个方法:Function Is_Greater(Node1:PTNode):虚拟和抽象的整数。这是留给用户来定义这个函数(我不知道它会是字符或整数等)。Pascal对象中的抽象方法

我试图测试这个单元,我遇到了一个问题。我创建了我的对象的子对象节点名为Object1 = Object(Node)并添加了一个属性X:integer,我想定义函数Is_Greater。这里是代码的声明,部分:在此之后

单位

Unit Tree; 
interface 
type PTNode=^Node; 
    Node=object 
    Left,Right:PTNode;  
    Balance:integer; 
    Function Is_Greater(Node1:PTNode):integer; virtual; abstract; 
    end; 

我定义我在我单位的功能不属于我的问题有关。

这是我的测试程序:

Program Test; 
uses Tree; 
Type PTObject=^Object1; 
     Object1=object(Node) 
     X:integer; 
     Function Is_Greater(Node1:PTNode):integer; virtual; 
     end; 
    Function Object1.Is_Greater(Node1:PTNode):integer; 
    begin 
     if X>Node1^.X then Is_Greater:=1 
     else if X<Node1^.X then Is_Greater:=-1 
     else Is_Greater:=0; 
    end; 

,这让我错误说是X不是目标节点的一部分。但是,当我尝试设置Node1:PTObject时,它给了我错误,我的功能不匹配其父。我不知道如何解决这个问题。

+0

[Pascal的摘要函数]的可能重复(http://stackoverflow.com/questions/32416605/abstract-function-in-pascal) – gnat

回答

1

所有对象变量都是指针。所以你不需要PTObjectPTNode类型。您可以简单地传递类型为NodeObject1的变量。

您的基本Node定义了一个期望参数Node1:PTNode的抽象方法。正如我之前所说,您可以将其更改为Function Is_Greater(Node1: Node):integer; virtual; abstractNode没有任何会员称为X。您需要将Node1转换为Object1才能访问X

这看起来是这样的:

Program Test; 
uses Tree; 
    Object1=object(Node) 
    X:integer; 
    Function Is_Greater(Node1:Node):integer; override; // don't use virtual here! 
    end; 

Function Object1.Is_Greater(Node1:Node):integer; 
var 
    OtherObject1: Objetc1; 
begin 
    // the next line can crash when there are objects in the tree 
    // which are not of type object1! 
    OtherObject1 := Node1 as Object1; 
    if X>OtherObject1 .X then Is_Greater:=1 
    else if X<OtherObject1.X then Is_Greater:=-1 
    else Is_Greater:=0; 
end;