Возможно ли наследование вложенных классов? - PullRequest
2 голосов
/ 21 июля 2009

Ну, у меня есть родительский класс с вложенным классом, объявленным на вкладке "защищенный" с переменной защищенного класса. В другом модуле у меня есть дочерний класс, который наследуется от родительского класса. Когда я пытаюсь получить доступ к чему-то защищенному / 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?

Ответы [ 4 ]

3 голосов
/ 21 июля 2009

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

0 голосов
/ 22 июля 2009

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

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

TSubParent = class(TParent)
protected
  type 
   TSubNested = class(TNested)
   public
     class var Z : integer;
   end;
end;
0 голосов
/ 21 июля 2009
TParent.x := 10;
TParent.TNested.y := 10;
0 голосов
/ 21 июля 2009

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

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

  1. Измените область действия y на public (или создайте для нее публичное свойство).
  2. Используйте y из вложенного класса, производного от TNested.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...