Возможно ли наследование вложенных классов?


Ну, у меня есть родительский класс с вложенным классом, объявленным на вкладке "protected" с защищенным классом variable.In еще одна единица у меня есть дочерний класс, который наследует от родительского класса.Когда я пытаюсь получить доступ к чему-то защищенному/общедоступному из родительского класса-это работает,но когда я пытаюсь получить доступ к чему-то защищенному из вложенного класса,это не работает.

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);

Как получить доступ г?

4   2   2009-07-21 13:26:16

4 ответа:

Y: integer-защищенное поле класса TNested, т. е. может использоваться только TNested и его собственными унаследованными классами.
Вы, вероятно, можете использовать TNested от TParent, но это потому, что в Delphi у вас может быть больший доступ, чем это должно быть, если вы звоните с того же устройства. Таким образом, TParent и TNested находятся в одном блоке, поэтому вы можете вызвать защищенные данные TNested из TParent. Но поскольку TChild находится в другой единице, чем TNested, это невозможно.

Это будет действительно работать, если TChild и TParent находятся в одном блоке, из-за неявной дружбы между классами внутри блока.

Чтобы получить доступ к y в вашем примере, вам нужно сделать одну из двух вещей:

  1. изменить масштаб Y для государственных (или создать общественную собственность на него).
  2. Используйте y из вложенного класса, производного от TNested.
TParent.x := 10;
TParent.TNested.y := 10;

Пример, который вы приводите, использует вложенный класс, а не наследует его.

Вложенные классы могут наследоваться в подклассах объявляющего класса:

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