Перечисления и наследование - PullRequest
1 голос
/ 07 апреля 2010

Я буду использовать (снова) следующую иерархию классов:

Event

и все следующие классы наследуются от Event:

SportEventType1 SportEventType2 SportEventType3 SportEventType4

Первоначально я разработал класс Event следующим образом:

public abstract class Event
{
    public abstract EventType EventType { get; }
    public DateTime Time { get; protected set; }

    protected Event(DateTime time) {
        Time = time;
    }
}

с EventType, определяемым как:

public enum EventType {
    Sport1,
    Sport2,
    Sport3,
    Sport4
}

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

  1. Если я хочу позже добавить новый Класс SportEventType мне придется изменить перечисление
  2. Если я позже решу удалить один SportEventType, который я чувствую, я не буду использовать у меня также большие проблемы с ENUM.
  3. У меня есть переменная класса в событии класс, который делает, в конце концов, предположения о виде классы, которые будут наследовать от него, который побеждает цель наследование.

Как бы вы решили такую ​​ситуацию? Определите в классе Event абстрактное свойство «Description», чтобы каждый дочерний класс его реализовывал? Наличие атрибута (аннотации в Java!) Вместо него задает переменную Description? Каковы были бы плюсы / минусы наличия переменной класса вместо атрибута / аннотации в этом случае? Есть ли еще какое-нибудь более элегантное решение?

Спасибо

Ответы [ 2 ]

1 голос
/ 07 апреля 2010

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

Если это просто вопрос описания, я бы сделал что-то вроде:

public abstract class Event
{
    public string Description { get; private set;}
    public DateTime Time { get; protected set; }

    protected Event(string description, DateTime time) {
        this.Description = description;
        Time = time;
    }
}

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

1 голос
/ 07 апреля 2010

Вы можете просто использовать оператор is и забыть о перечислении.

var myEvent = Event.Create(type);

if (myEvent is BaseballGame)
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...