2010-01-14 33 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