Расширение перечисления через наследование - PullRequest
78 голосов
/ 11 сентября 2008

Я знаю, что это скорее идет вразрез с идеей перечислений, но возможно ли расширить перечисления в C # / Java? Я имею в виду «расширение» как в смысле добавления новых значений в перечисление, так и в ОО-смысле наследования от существующего перечисления.

Я предполагаю, что это не возможно в Java, поскольку он получил их только недавно (Java 5?). C # кажется более щадящим для людей, которые хотят делать сумасшедшие вещи, поэтому я подумал, что это возможно каким-то образом Предположительно это может быть взломано с помощью рефлексии (не то, чтобы вы все использовали этот метод)?

Я не обязательно заинтересован в реализации какого-либо данного метода, он просто вызвал мое любопытство, когда мне пришло в голову: -)

Ответы [ 14 ]

0 голосов
/ 26 августа 2013

Что касается java, то это не разрешено, потому что добавление элементов в enum фактически создаст суперкласс, а не подкласс.

Рассмотрим:

 enum Person (JOHN SAM}   
 enum Student extends First {HARVEY ROSS}

Общий случай использования полиморфизма будет

 Person person = Student.ROSS;   //not legal

что явно не так.

0 голосов
/ 12 июля 2010

Я хотел бы иметь возможность добавлять значения в перечисления C #, которые представляют собой комбинации существующих значений. Например (это то, что я хочу сделать):

AnchorStyles определяется как

public enum AnchorStyles { None = 0, Top = 1, Bottom = 2, Left = 4, Right = 8, }

и я хотел бы добавить AnchorStyles.BottomRight = Right + Bottom, чтобы вместо

my_ctrl.Anchor = AnchorStyles.Right | AnchorStyles.Bottom;

Я могу просто сказать

my_ctrl.Anchor = AnchorStyles.BottomRight;

Это не вызывает проблем, упомянутых выше, поэтому было бы неплохо, если бы это было возможно.

0 голосов
/ 11 сентября 2008

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

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

0 голосов
/ 11 сентября 2008

Вы не можете наследовать / расширять перечисление, вы можете использовать атрибуты до объявить описание Если вы ищете целочисленное значение, оно встроено.

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