在课堂上创建父母/子女关系

时间:2018-08-26 17:18:35

标签: oop pascal paradigms delphi

我有两个班,一个子班:

type MyChildClass = class
public
parent: ^MyParent;
end;

和一个父类:

type MyParentClass = class
public
childs: array of ^MyChildClass;
end;

但是,由于只有上一个类声明了最后一个才知道另一个,所以这是行不通的。示例:

program Test;

interface

type MyChildClass = class
public
parent: ^MyParentClass;
end;

type MyParentClass = class
public
childs: array of ^MyChildClass;
end;

implementation

end.

这不会编译,因为第7行会按预期抛出错误“未声明的标识符'MyParentClass'。使用抽象类只能部分解决问题。我真的在寻找解决方案上很挣扎。也许使用接口会有所帮助?

2 个答案:

答案 0 :(得分:3)

Pascal是一种经过pass编译的语言,因此编译器只扫描一个文件一次:在每一次必须知道每个标识符的情况下。在创建循环引用时(例如在这种情况下),您引用的是当前不允许的,写在之后的类。要解决此问题,您需要使用所谓的 forward声明,即您向编译器声明(很有希望)在代码中的某个地方它将找到该标识符(请查看代码 problem1 )。

此外,您正在定义多个不同的类型范围(通过多次写入 type )。每个类型作用域都有自己的类型(并且一个作用域中定义的类型不能被另一个作用域看到),因此,您需要定义一个类型(请查看代码 problem2 )。

program Test;

interface

type // declare a single type scope (problem 2)
    MyParentClass = class; // this is the forward declaration (problem 1)

    MyChildClass = class
    public
        parent: ^MyParentClass;
    end;

    MyParentClass = class
    public
        childs: array of ^MyChildClass;
    end;

implementation

end.

答案 1 :(得分:-1)

program Test;

interface
type 
    MyParentClass = class;

    MyChildClass = class
    public
        parent: ^MyParentClass;
    end;

    MyParentClass = class
    public
        childs: array of ^MyChildClass;
    end;

implementation

end.