为什么嵌套类型的作用域不包括派生类?

Why nested types' scope does not include derived classes?

提问人:kludg 提问时间:12/8/2012 最后编辑:JasonMArcherkludg 更新时间:6/7/2015 访问量:398

问:

我想知道为什么嵌套类型的范围不包括 Delphi 中的派生类;它可以使代码更干净:

type
  TBaseTest = class
  public type
    PVector = ^TVector;
    TVector = record
      A, B, R: Integer;
    end;
  public
    procedure Execute(var Vector: TVector); virtual; abstract;
  end;

  TTestA = class(TBaseTest)
  public
// E2003 Undeclared identifier: 'TVector'
    procedure Execute(var Vector: TVector); override;
// workaround:
//  procedure Execute(var Vector: TBaseTest.TVector); override;
  end;
Delphi 类型 嵌套

评论

3赞 Marjan Venema 12/8/2012
我不会称您的“解决方法”为解决方法。您将如何区分作为两个不同类的嵌套类型的 TVector?虽然,不可否认,在派生类中,它可以默认为基类型的 TVector......
2赞 David Heffernan 12/8/2012
我猜设计师想避免歧义。也许他们从多年来与可怕的声明打交道中吸取了教训。with
1赞 kludg 12/9/2012
可能的解决方案是引入“密封”嵌套类型,即无法在派生类中重新声明的类型。

答:

0赞 Mikhail Kopylov 1/9/2013 #1

如果我没记错的话,当你在 TBaseTest 中编写 TVertor 时,编译器首先在这个类中查找它,然后在这个单元中查找它,然后在“使用”部分的模块中查找它。这就是为什么你可以编写简单的 TVector,即 TBaseTest.TVector。

当您编写一个派生自 TBaseTest 的类 TTestA 并在那里使用 TVector 时,它首先在 TTestA 中查找(没有 TVector),然后在此模块中查找(也没有 TVetor),然后在 Uses 中查找。如果要使用 TBaseTest 的内部类,则应直接写入 TBaseTest.TVetor,因为 TVector 是在 TBaseTest 中定义的,而不是在 TTestA 中定义的。

评论

0赞 David Heffernan 1/9/2013
最后一句话毫无意义。它重复问题中出现的内容。
0赞 Mikhail Kopylov 1/9/2013
我的意思是内部类是不可继承的,比如 TBaseTest.TVector 和 TTestA.TVector 是不同的。
0赞 David Heffernan 1/9/2013
这在问题中有所说明。问题是问为什么设计是为什么它。