我有一个基类和一个在不同类中定义的枚举类型。基类有一个抽象的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类型?提前谢谢。
答案 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.Enum
是public 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}}传递给泛型类型参数。