Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举与继承_C#_Java_Design Patterns_Oop - Fatal编程技术网

C# 枚举与继承

C# 枚举与继承,c#,java,design-patterns,oop,C#,Java,Design Patterns,Oop,我将(再次)使用以下类层次结构: Event 并且以下所有类都继承自事件: SportEventType1 SportEventType2 SportEventType3 SportEventType4 我最初设计的事件类如下: public abstract class Event { public abstract EventType EventType { get; } public DateTime Time { get; protected set; }

我将(再次)使用以下类层次结构:

Event
并且以下所有类都继承自事件:

SportEventType1 SportEventType2 SportEventType3 SportEventType4
我最初设计的事件类如下:

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

    protected Event(DateTime time) {
        Time = time;
    }
}
事件类型定义为:

public enum EventType {
    Sport1,
    Sport2,
    Sport3,
    Sport4
}
最初的想法是,每个SportEventTypeX类将设置其正确的EventType。现在我想起来了,我认为这种方法是完全不正确的,原因如下:

  • 如果我以后想添加一个新的 SportEventType类我将不得不 修改枚举
  • 如果我以后决定删除一个 SportEventType,我觉得我不会 使用我也有很大的麻烦 枚举
  • 我在事件中有一个类变量 毕竟, 关于 将从中继承的类, 哪一种违背了我们的目的 继承权
  • 你将如何解决这种情况?在事件类中定义一个抽象的“Description”属性,让每个子类实现它?让属性(Java中的注释!)改为设置其描述变量?在这种情况下,使用类变量而不是属性/注释的优点/缺点是什么?还有其他更优雅的解决方案吗


    谢谢

    您只需使用
    is
    操作符,就可以忘记枚举了

    var myEvent = Event.Create(type);
    
    if (myEvent is BaseballGame)
    {
        // ...
    }
    

    如果您的子类将是EventType,我不会为EventType执行枚举。枚举适用于一组固定的选项——在您的情况下,您需要继承的灵活性,所以只需直接使用子类化

    如果只是描述的问题,我会这样做:

    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;
        }
    }
    

    这只是让您的子类为您指定这一点,听起来这正是您所追求的。

    理想情况下,您希望尽可能避免这一点。如果您有“特定于事件”的逻辑,最好将其放在子类中。@Reed-理想情况下,我们将生活在一个理想的单词中。:)非常正确-有时也会这样做,但在可能的情况下应该避免。。。我只是想把它扔出去:)@Reed-我完全理解,事实上,如果我知道时间限制会导致多态性的无效使用,我会努力寻求一种更简单的函数方法。