Атрибуты не наследуют? - PullRequest
2 голосов
/ 23 апреля 2010

Я играл с атрибутами и предполагал, что они наследуются, но это не так:

type
  [MyAttribute]
  TClass1 = class
  end;

  TClass2 = class(TClass1)
  end;

TClass2 не имеет атрибута "MyAttribute", хотя он наследуется от Class1.Есть ли возможность сделать атрибут наследуемым?Или мне нужно идти вверх по иерархии классов и искать атрибуты?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

Атрибут является украшением для класса или другого символа, такого как метод.Атрибут украшает объявление, но не является функцией класса.В результате атрибут не наследуется.

Да, вы можете перейти к иерархии классов, чтобы найти атрибут, но есть лучшее решение.Используйте пустой интерфейс (IMyInterface = Interface) в качестве интерфейса «маркера».Все потомки класса, реализующего интерфейс, также будут реализациями этого интерфейса.Все, что вам нужно, это убедиться, что ваш базовый класс реализует IInterface, что будет уже в случае, если ваш базовый класс происходит от TInterfacedObject или TComponent.

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

0 голосов
/ 14 мая 2010

Я никогда не использовал атрибуты в Delphi - поэтому этот ответ является своего рода предположением. Но я знаю об аннотациях в Java, что в принципе одно и то же.

Но имеет смысл, если они не наследуются: подкласс может потребовать других атрибутов или противоречить атрибутам суперкласса. Кроме того, если атрибуты не наследуются, у вас есть возможность следовать иерархии, если это необходимо для «вашего» варианта использования атрибута. Если бы они были унаследованы, у вас возникли бы проблемы с определением, действительно ли атрибут принадлежит конкретному классу, а не любому из его суперклассов.

Если вам нужно наследование и вы не хотите смотреть на суперклассы, возможно, имеет смысл использовать функцию класса, свойство класса или даже интерфейс тега (не объявляющий методов). Те унаследованы.

...