【问题标题】:Is Inheriting nested classes possible?可以继承嵌套类吗?
【发布时间】:2009-07-21 09:26:16
【问题描述】:

好吧,我有一个父类,它在“受保护”选项卡中声明了一个带有受保护类变量的嵌套类。在另一个单元中,我有一个子类,它继承自父类。当我尝试访问受保护的东西时/public 来自父类 - 它可以工作,但是当我尝试访问受嵌套类保护的东西时,它不起作用。

type
  TParent = class(TObject)

  protected
    class var x:integer;
    type
      TNested = class(TObject)

        protected
          class var y:integer;
    end;
end;

我在子类中的代码:

x := 10; //works
y := 10; //undeclarated idenitifier 'y'.
TNested.y := 10; //undeclarated idenitifier 'y'

子类的声明是:

type
  TChild = class(TParent);

我如何访问 y?

【问题讨论】:

    标签: delphi oop class


    【解决方案1】:

    y:integer 是 Tnested 类的受保护字段,即。只能由 Tnested 和它自己的继承类使用。
    您可能会使用 TParent 中的 TNested,但这是因为在 Delphi 中,您可能拥有比从同一单元调用更大的访问权限。所以 TParent 和 TNested 在同一个单元中,所以你可以从 TParent 调用 TNested 保护数据。但是由于 TChild 与 TNested 处于不同的单元中,所以这是不可能的。

    【讨论】:

    • 这里没有问什么。 Tnested 是一个嵌套类(在 D2006? 及更高版本中可用),而不是同一单元中的另一个类。它被称为 TParent.TNested
    • @Gerry,对我来说,这里的问题是从这个类之外调用某个类的受保护元素。无论此类驻留在何处,从外部访问某个类的受保护字段都会以某种方式违反封装。
    【解决方案2】:

    如果 TChild 和 TParent 在同一个单元中,这实际上会起作用,因为单元内的类之间存在隐含的友谊。

    要在您的示例中访问 y,您需要执行以下两项操作之一:

    1. 将 y 的范围更改为 public(或为其创建公共属性)。
    2. 使用从 Tnested 派生的嵌套类中的 y。

    【讨论】:

      【解决方案3】:
      TParent.x := 10;
      TParent.TNested.y := 10;
      

      【讨论】:

        【解决方案4】:

        您给出的示例是使用嵌套类,而不是继承它。

        嵌套类可以在声明类的子类中继承:

        TSubParent = class(TParent)
        protected
          type 
           TSubNested = class(TNested)
           public
             class var Z : integer;
           end;
        end;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-01
          • 2013-09-18
          • 1970-01-01
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多