Есть ли базовый объект для перечисления С#?

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

В идеале это было бы так:

public abstract BaseEnum MyEnum { get; set; }

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

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

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


person Fiona - myaccessible.website    schedule 14.01.2010    source источник
comment
Хотя перечисления наследуются от структуры System.Enum, вы не можете заставить производный класс изменить возвращаемый тип. Переопределенный метод также должен будет объявить возвращаемый тип System.Enum.   -  person mmx    schedule 14.01.2010
comment
Мне интересно услышать «почему» на этот вопрос, наследование не существует для перечислений, потому что это не имеет смысла: это просто сопоставления байтов, и поэтому они на самом деле не взаимозаменяемы? (т.е. я не думаю, что существует ситуация, когда ListItemType взаимозаменяем, например, с DayOfWeek)   -  person Ed James    schedule 14.01.2010
comment
Я думаю, что ваша проблема больше социальная, чем техническая. Вам не нужно указывать это в базовом классе. Просто добавьте где-нибудь комментарий и задокументируйте стиль и имя свойства, которое следует использовать.   -  person mmx    schedule 14.01.2010
comment
Я не обязательно думаю, что им будут злоупотреблять, мне больше нравится, чтобы мои базовые классы были как можно более четко определены!   -  person Fiona - myaccessible.website    schedule 14.01.2010


Ответы (3)


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

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

тогда

public class DerivedClass : BaseClass<SomeEnum>

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

person Jon Skeet    schedule 14.01.2010
comment
Ооо, мне нравится, я знал, что что-то упустил из виду. Однако, чтобы все усложнить, у меня есть еще один класс, который использует список этих базовых классов, поэтому: public List‹BaseClass‹Enum›› MyObjects { get; установлен; }, который затем не компилируется, так как T должен быть типом значения. Что я могу поставить на его место, чтобы заставить это работать? - person Fiona - myaccessible.website; 14.01.2010
comment
Должна ли она содержать разные виды BaseClass (т. е. для разных перечислений) или только несколько экземпляров одного и того же типа? Возможно, вам понадобится неуниверсальный базовый класс для базового класса, который тогда не будет содержать это свойство. - person Jon Skeet; 14.01.2010
comment
Различные виды базовых классов. Теперь у меня есть неуниверсальная база для базового класса, и она отлично работает, спасибо. - person Fiona - myaccessible.website; 14.01.2010

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

person Robert Giesecke    schedule 14.01.2010

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

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
person Rubens Farias    schedule 14.01.2010