为啥嵌套类型的范围不包括派生类?
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 是不同的。 问题中已说明。问题是问为什么设计就是它的原因。以上是关于为啥嵌套类型的范围不包括派生类?的主要内容,如果未能解决你的问题,请参考以下文章