Предоставление унаследованных статических свойств (концептуально) - PullRequest
5 голосов
/ 08 января 2009

У меня есть базовый класс C #, с которым я должен был связывать информацию для каждого типа (а не для каждого экземпляра). По сути, я хочу, чтобы все дочерние классы представляли Icon и FriendlyName, представляющие тип. Я бы хотел , а не , чтобы создать экземпляр типа, чтобы получить эту информацию, и я хочу требовать, чтобы все дочерние классы предоставляли эту информацию. В идеале это должно быть в интерфейсе, из которого получена база.

Я пытался использовать класс Attribute, но для него требуется постоянное значение, поэтому, хотя я могу установить FriendlyName, я не могу установить Icon и не могу найти способ сделать атрибут Attribute обязательным, так что дочерние классы могут остаться без него (до времени выполнения).

Я добавил к базе статическое свойство, которое дети могут скрывать, но это уродливо, а значения из базы действительно бессмысленны. Он не может знать, как зовут ребенка. Я мог бы сделать базовый бросок в Собственности, но, опять же, его не поймают до времени выполнения.

У кого-нибудь есть идеи, как мне реализовать что-то подобное? Есть шаблон, который я пропускаю? Любое нестандартное мышление также приветствуется.

Редактировать: На самом деле мне нужна возможность требовать атрибуты класса вдоль дерева наследования и иметь возможность использовать встроенный ресурс для установки этих атрибутов. Вся информация, которая будет возвращена, действительно статична и известна при компиляции. Я просто не могу придумать, как красиво это разоблачить.

Редактировать 2: Вот более конкретный пример того, что мне нужно:

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

abstract class Vehicle { ... }

У меня тогда двое детей:

class Car : Vehicle { ... }

class Truck : Vehicle { ... }

Я хотел бы иметь возможность получить значок, представляющий «Автомобиль» или «Грузовик», без необходимости создания экземпляра одного (а-ля Car.Icon), поскольку все транспортные средства данного типа будут иметь все тот же значок.

Я также хочу убедиться, что все Типы, полученные из транспортных средств, предоставляют такой же значок для получения этой иконки, если кто-то придет в будущем и добавит новый класс

class Airplane : Vehicle  { ... }

Редактировать 3: Зачем мне это нужно? Ну, у нас есть приложение, которое может принимать плагины. Плагин определяется типом, и когда тип загружается, мы показываем пользователю значок и имя. Когда они щелкают по значку, он создает экземпляр этого типа (и дает им диалоговое окно для именования экземпляра и т. Д.). Мне не нужно или не нужно создавать экземпляр типа, чтобы получить значок.

Ответы [ 3 ]

1 голос
/ 08 января 2009

Я думаю, что вы, возможно, упустили момент, когда вы не можете переопределить статические свойства по уважительной причине, а именно: когда вы пишете код для его вызова, у вас нет instace, поэтому компилятор будет статически связать его в это время - если вам нужен полиморфизм, вам нужно работать с экземпляром для среды выполнения, чтобы определить, какую версию метода вызывать.

РЕДАКТИРОВАТЬ: (в ответ на ваш EDIT2)

Из какого сценария вы хотели бы вызвать это?

Если вы хотите показать свой значок на экземпляре, у вас есть экземпляр, так почему бы не использовать его как свойство на экземпляре (потому что, в конце концов, кто-то может переопределить ваш Car, чтобы создать SportsCar и вам нужен другой значок) - по сути, вы запрашиваете свойство вашего объекта, хотя оно и соответствует концептуальной модели (так что это не количество колес, максимальная скорость и т. Д .; визуализировать его конечному пользователю)

РЕДАКТИРОВАТЬ2: (В ответ на ваш EDIT3)

Подход, который я бы применил, заключался бы в том, чтобы использовать что-то подобное, используя атрибут, чтобы определить, какой встроенный ресурс использовать в качестве значка для соответствующего типа (поэтому вам не нужен экземпляр), и использовать отражение, чтобы прочитать значение , Вы можете определить свой собственный атрибут или посмотреть на ToolboxItemAttribute , который может быть полезным.

1 голос
/ 08 января 2009

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

Они будут абстрактными, а не виртуальными, поэтому вы заставляете реализацию производным классом. Я знаю, что это не чисто, потому что это информация, которая лучше хранится на уровне типов, но это единственный способ, которым я вижу, как выполнить это требование во время компиляции.

0 голосов
/ 24 июня 2009

Может быть, вы можете определить атрибут, который будет использоваться для регистрации этого объекта в вашей системе плагинов.

Таким образом, вы заставите разработчика класса назначить атрибут для работы в вашей системе плагинов.

Возможно, вы можете использовать такой подход, как ToolboxBitmapAttribute , где вы можете установить изображение, найденное в ресурсе вашей библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...