2010-01-14 51 views
1

我知道你不能在枚舉中使用繼承,所以在我的基類中,我想定義實現它的類必須爲屬性返回某種類型的枚舉。是否有一個C#枚舉的基礎對象?

理想的情況下,這將是這樣的:

public abstract BaseEnum MyEnum { get; set; } 

然後所有的實施者將不得不回到某種形式枚舉。但顯然BaseEnum不存在。我可以使用對象,但我寧願不要。

有沒有這樣做的好方法?

編輯︰我這樣問,因爲我基本上想要在實現類中保留屬性的名稱相同 - 我知道我將無法使用基類中的枚舉,但是如果我沒有把它放在基礎中,那麼實現類可以爲它們的屬性名稱決定它們的枚舉類型,隨着時間的推移它們可能會變得不清楚,因爲它們會偏向它們自己的實現。

+0

雖然枚舉繼承自「System.Enum」結構,但您無法真正使派生類更改返回類型。重寫的方法將不得不聲明它的返回類型'System.Enum'。 – 2010-01-14 08:53:28

+2

我有興趣聽到這個問題的'爲什麼',繼承是不存在的枚舉,因爲它沒有任何意義:它們只是字節映射,所以不能真正互換? (例如,我不認爲ListItemType與DayOfWeek可以互換) – 2010-01-14 08:55:08

+0

我認爲你的問題比技術更具社會性。您不需要在基類中指定它。只需在某處添加註釋並記錄應使用的樣式和屬性名稱。 – 2010-01-14 09:31:27

回答

2

您可以輕鬆地進來C#最接近的是使類型一般以結構約束:

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

然後

public class DerivedClass : BaseClass<SomeEnum> 

C#不會讓你指定一個限制枚舉類型的約束,儘管CLI支持它。我有一個名爲Unconstrained Melody的項目,它使用後期構建技巧來實施這樣的約束 - 但我不建議你採取相同的方法,除非你感覺有點大膽。結構約束至少會將您限制爲值類型,這可能足夠好。

+0

Oooh我喜歡它,我知道我忽略了一些東西。然而,僅僅爲了使事情複雜化,我有另一個類使用這些基類的列表,所以: public List > MyObjects {get;組; } 然後它不能編譯,因爲T必須是一個值類型。我能做些什麼來完成這項工作? – 2010-01-14 09:31:20

+0

這是否必須能夠容納不同類型的BaseClass(即針對不同的枚舉),還是隻能有幾個相同類型的實例?您可能需要爲基類提供一個非泛型基類,而後者將不包含該屬性。 – 2010-01-14 09:35:09

+0

不同種類的BaseClass。我現在有一個非基類的基類,它工作正常,謝謝。 – 2010-01-14 09:47:18

3

所有枚舉繼承自System.Enum。

1

你應該看看這裏:Enum 「Inheritance」

 
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