为啥嵌套类型的范围不包括派生类?

Posted

技术标签:

【中文标题】为啥嵌套类型的范围不包括派生类?【英文标题】:Why nested types' scope does not include derived classes?为什么嵌套类型的范围不包括派生类? 【发布时间】:2012-11-26 11:55:33 【问题描述】:

我想知道为什么嵌套类型的范围不包括 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;

【问题讨论】:

我不会将您的“解决方法”称为解决方法。您如何区分作为两个不同类的嵌套类型的 TVector?虽然,不可否认,在派生类中它可以默认为基类型的 TVector... 我猜设计师想避免歧义。也许他们从多年使用可怕的with 声明中学到了东西。 可能的解决方案是引入“密封”嵌套类型,即不能在派生类中重新声明的类型。 【参考方案1】:

如果我没记错的话,当你在 TBaseTest 中编写 TVertor 时,编译器会先在此类中查找,然后在本单元中查找,然后在 Uses 部分的模块中查找。这就是为什么您可以编写简单的 TVector,即 TBaseTest.TVector。

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

【讨论】:

最后一句相当无意义。它重复了问题中出现的内容。 我的意思是内部类是不可继承的,像 TBaseTest.TVector 和 TTestA.TVector 是不同的。 问题中已说明。问题是问为什么设计就是它的原因。

以上是关于为啥嵌套类型的范围不包括派生类?的主要内容,如果未能解决你的问题,请参考以下文章

C ++从具有嵌套类的接口派生

为啥 C++ 不能用“超类”类型的右值初始化“派生类”类型的变量?

为啥派生类对象的指针数组无法声明

5继承与派生3-类型兼容规则

为啥指向基类的派生类指针可以调用派生类成员函数? [复制]

引用泛型类型的类属性