【问题标题】:Why aren't local type declarations inherited?为什么不继承本地类型声明?
【发布时间】:2021-01-23 14:24:02
【问题描述】:

假设我有一个像这样声明本地类型的类:

type
  TAncestor = class
    type
      TLocalType = (just, some, example); 
  end;

然后,我想在子类中使用该本地类型。但是,以下内容无法编译。

type
  TChild = class (TAncestor)
    procedure Test (AVariable: TLocalType);  // error: undeclared identifier: 'TLocalType'
  end;

为了使用该类型,似乎需要一个完全限定的类型名称。以下编译:

type
  TChild = class (TAncestor)
    procedure Test (AVariable: TAncestor.TLocalType);
  end;

虽然这可行,但感觉相当不雅。 (另外,如果我想更改 TChild 的祖先,我必须更改两行中的类名。)我可能遗漏了一些东西;类型声明不是简单地从祖先继承的原因是什么?

【问题讨论】:

  • 恐怕原因真的很无聊:这就是目前语言(或者,特别是编译器)的设计方式。

标签: delphi


【解决方案1】:

类型实际上是继承的。除了祖先类之外,您还可以通过使用子类限定标识符来访问它:

你也可以使用 TChild.TLocalType:

TAncestor = class
type
    TLocalType = (just, some, example);
end;

TChild = class (TAncestor)
    procedure Test (AVariable: TChild.TLocalType);
end;

为什么会这样?因为 Embarcadero 的设计选择。

【讨论】:

  • 问题问为什么语言是这样设计的。它不要求替代方案。这可能是一个评论。我建议删除答案并转换为评论。
  • 啊,好的。我害怕错过继承类型可能导致问题的潜在情况。所以类型实际上是继承的,编译器只是无法识别它。谢谢大家花时间解释。
猜你喜欢
  • 2018-06-06
  • 2021-06-23
  • 2016-10-07
  • 2011-04-16
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
相关资源
最近更新 更多