2010-04-06 98 views
1

我會用(再次)下面的類層次結構:枚舉和繼承

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

用的EventType被定義爲:

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

最初的想法是,每個SportEventTypeX類將設置其正確的EventType。現在我想起來了,我覺得這種做法是完全不正確的,原因如下:

  1. 如果我想在以後添加新的 SportEventType類,我將不得不 修改枚舉
  2. 如果我以後決定刪除一個 SportEventType,我覺得我不會 使用我也在與 enum很大的麻煩。
  3. 我有一個類變量在事件 類製作,畢竟,關於那種 類將從它, 這有點違背 繼承的目的繼承 假設。

你會如何解決這種情況?在Event類中定義一個抽象的「Description」屬性,讓每個子類實現它?有一個屬性(Java中的註釋!)設置其描述變量?在這種情況下,使用類變量而不是屬性/註釋有什麼優點/缺點?那裏有沒有其他更優雅的解決方案?

感謝

回答

1

如果您的子類將是EventTypes,我不會爲一個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; 
    } 
} 

這只是讓你的子類指定這個對你來說,這聽起來就像是你反正以後是什麼。

1

你可以簡單地使用is運營商,而忘記了一個枚舉。

var myEvent = Event.Create(type); 

if (myEvent is BaseballGame) 
{ 
    // ... 
} 
+0

理想情況下,儘可能避免這種情況。如果你有「特定事件」的邏輯,最好把它放在子類中。 – 2010-04-06 23:46:10

+1

@Reed - 理想情況下,我們會生活在一個理想的詞。 :) – ChaosPandion 2010-04-06 23:49:36

+0

非常真實 - 有時要做到這一點,但它是應儘可能避免的事情...只是認爲我會把它扔出去:) – 2010-04-07 00:07:17