Есть ли базовый объект для перечисления c #? - PullRequest
1 голос
/ 14 января 2010

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

В идеале это будет выглядеть так:

public abstract BaseEnum MyEnum { get; set; }

Тогда все исполнители должны будут возвращать некоторую форму перечисления. Но очевидно, что BaseEnum не существует. Я могу использовать объект, но я бы не хотел.

Есть ли хороший способ сделать это?

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

Ответы [ 3 ]

3 голосов
/ 14 января 2010

Все перечисления наследуются от System.Enum.

2 голосов
/ 14 января 2010

Самое близкое, что вы можете легко найти в C #, - это сделать тип универсальным с ограничением структуры:

public abstract class BaseClass<T> where T : struct
{
    public abstract T MyEnum { get; set; }
}

тогда

public class DerivedClass : BaseClass<SomeEnum>

C # не позволит вам указать ограничение, ограничивающее перечисление типов, даже если CLI его поддерживает. У меня есть проект под названием Unconstrained Melody , который использует трюки после сборки, чтобы навязать такое ограничение, но я бы не советовал использовать тот же подход, если вы не чувствуете себя немного смелым. Ограничение структуры, по крайней мере, ограничит вас типами значений, которые могут быть достаточно хорошими.

1 голос
/ 14 января 2010

Вы должны посмотреть здесь: Перечисление «Наследование» :

See section 8.5.2 of the CLI spec for the full details.
Relevant information from the spec

 * All enums must derive from System.Enum
 * Because of the above, all enums are value types and hence sealed
...