【问题标题】:Is there a base object for a c# enum?c# 枚举是否有基础对象?
【发布时间】:2010-01-14 08:49:25
【问题描述】:

我知道你不能对枚举使用继承,所以在我的基类中我想定义实现它的类必须为属性返回某种类型的枚举。

理想情况下,应该是这样的:

public abstract BaseEnum MyEnum { get; set; }

那么所有的实现者都必须返回某种形式的枚举。但显然 BaseEnum 不存在。我可以使用对象,但我不想这样做。

有什么好的方法吗?

编辑:我问这个是因为我本质上想在实现类中保持属性的名称相同 - 我知道我将无法使用枚举基类,但如果我不把它放在基类中,那么实现类可以决定它们自己的枚举属性名称,随着时间的推移,这可能会变得不清楚,因为它们会转向自己的实现。

【问题讨论】:

  • 虽然枚举继承自System.Enum 结构,但您不能真正让派生类更改返回类型。被覆盖的方法也必须声明其返回类型System.Enum
  • 我很想听听这个问题的“为什么”,枚举不存在继承,因为它没有真正意义:它们只是字节映射,所以不是真的可以互换吗? (例如,我不认为 ListItemType 可以与 DayOfWeek 互换)
  • 我认为您的问题更多是社会问题而不是技术问题。您不需要在基类中指定它。只需在某处添加注释并记录应使用的样式和属性名称。
  • 我不一定认为它会被滥用,更多的是我喜欢我的基类尽可能地定义好!

标签: c# inheritance enums base-class


【解决方案1】:

所有枚举都继承自 System.Enum。

【讨论】:

    【解决方案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 的项目,它使用构建后的技巧来强制执行这种约束——但我不建议你采用相同的方法,除非你觉得有点大胆。 struct 约束至少会将您限制为值类型,这可能已经足够了。

    【讨论】:

    • 哦,我喜欢它,我知道我忽略了一些东西。然而,为了使事情复杂化,我有另一个类使用这些基类的列表,所以: public List> MyObjects { get;放;然后不会编译,因为 T 必须是值类型。我可以用什么代替它来完成这项工作?
    • 它是否必须能够容纳不同种类的 BaseClass(即针对不同的枚举),或者只是几个相同种类的实例?您可能需要为基类创建一个非泛型基类,这样就不会包含该属性。
    • 不同种类的 BaseClass。我现在有一个基类的非泛型基类,它工作正常,谢谢。
    【解决方案3】:

    你应该看看这里:Enum “Inheritance”:

    有关完整详细信息,请参阅 CLI 规范的第 8.5.2 节。 规范中的相关信息 * 所有枚举必须派生自 System.Enum * 由于上述原因,所有枚举都是值类型,因此是密封的

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2020-05-30
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      相关资源
      最近更新 更多