在C#中覆盖抽象的Enum属性

时间:2014-07-24 18:22:15

标签: c# properties enums abstract

我有一个基类和一个在不同类中定义的枚举类型。基类有一个抽象的System.Enum属性,我想用我的自定义枚举类型实现,但是我一直收到一个错误,说我的派生属性“必须是类型System.Enum才能匹配被覆盖的成员。”

我的枚举类型如下:

public static class EnumClass
{
    public enum MyEnum {
        option1,
        option2
    };
}

我的基类看起来像这样:

public abstract class BaseClass 
{
    public abstract Enum Specification { get; set; }
}

我的派生类看起来像这样:

public class DerivedClass : BaseClass 
{
    private EnumClass.MyEnum mSpecification;

    public override EnumClass.MyEnum Specification
    {
         get { return mSpecification; }
         set { mSpecification = value; }
    }
}

有谁可以告诉我为什么我的枚举不是System.Enum类型?提前谢谢。

1 个答案:

答案 0 :(得分:4)

您的BaseClass给出了"承诺"所有子类都将具有类型Specification的属性System.Enum。这意味着,如果我有任何对象BaseClass b = ...,我可以使用Specification分配给b.Specification = enumValue,其中enumValue 任何 System.Enum

现在,如果你派生于DerivedClass,我就不能再将任何 System.Enum分配给EnumClass.MyEnum Specification,而只能将EnumClass.MyEnum类型的值分配给public abstract class BaseClass { public abstract System.Enum GetSpecification(); public abstract void SetSpecification(System.Enum value); } public class DerivedClass : BaseClass { private EnumClass.MyEnum specification; public override EnumClass.MyEnum GetSpecification() { return specification; } public override void SetSpecification(EnumClass.MyEnum value) { specification = value; } } 。这就是为什么这个属性不满足其基类的合同。

因此,编译器会告诉您此实现违反了抽象基类的继承,并且您必须在派生类中使用相同的属性类型。

为了更好地理解,将属性拆分为两种方法:

BaseClass.SetSpecification

显然,DerivedClass.SetSpecification无法覆盖EnumClass.MyEnum,因为参数类型System.Enumpublic abstract class BaseClass<T> where T : struct, IConvertible // almost only enums { public abstract T Specification { get; set; } } public class DerivedClass : BaseClass<EnumClass.MyEnum> { public EnumClass.MyEnum Specification { get; set; } } 子类

如果要为每个子类允许特定类型的枚举,可以使用泛型:

where T : enum

不幸的是,IConvertible是不可能的,因此仍有可能将其他struct {{1}}传递给泛型类型参数。