C# 重写C中的抽象枚举属性#

C# 重写C中的抽象枚举属性#,c#,properties,enums,abstract,C#,Properties,Enums,Abstract,我在另一个类中定义了基类和枚举类型。基类有一个抽象System.Enum属性,我希望使用自定义枚举类型实现该属性,但是我不断收到一个错误,指出我的派生属性“必须是System.Enum类型才能匹配重写的成员。” 我的枚举类型如下所示: public static class EnumClass { public enum MyEnum { option1, option2 }; } public class DerivedClass : Base

我在另一个类中定义了基类和枚举类型。基类有一个抽象System.Enum属性,我希望使用自定义枚举类型实现该属性,但是我不断收到一个错误,指出我的派生属性“必须是System.Enum类型才能匹配重写的成员。”

我的枚举类型如下所示:

public static class EnumClass
{
    public enum MyEnum {
        option1,
        option2
    };
}
public class DerivedClass : BaseClass 
{
    private EnumClass.MyEnum mSpecification;

    public override EnumClass.MyEnum Specification
    {
         get { return mSpecification; }
         set { mSpecification = value; }
    }
}
我的基类如下所示:

public abstract class BaseClass 
{
    public abstract Enum Specification { get; set; }
}
我的派生类如下所示:

public static class EnumClass
{
    public enum MyEnum {
        option1,
        option2
    };
}
public class DerivedClass : BaseClass 
{
    private EnumClass.MyEnum mSpecification;

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

有人能告诉我为什么我的枚举不是System.enum类型吗?提前感谢。

您的
基类
给出了一个“承诺”,即它的所有子类都将具有
System.Enum类型的
规范
。这意味着,如果我有任何对象
BaseClass b=…
,我可以用
b.Specification=enumValue
分配给它的
Specification
,其中
enumValue
任何
系统.Enum

现在,如果您在
DerivedClass
中进行派生,我无法再将任何
System.Enum
分配给
EnumClass.MyEnum规范
,而只能分配
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; }
}
公共抽象类基类,其中T:struct,IConvertible//几乎仅枚举
{
公共抽象T规范{get;set;}
}
公共类派生类:基类
{
公共EnumClass.MyEnum规范{get;set;}
}

不幸的是,
其中T:enum
是不可能的,因此仍然有可能将其他
IConvertible
结构
传递给泛型类型参数。

您的
基类
给出了一个“承诺”它的所有子类都将具有类型为
System.Enum
的属性
Specification
。这意味着,如果我有任何对象
BaseClass b=…
,我可以用
b.Specification=enumValue
分配给它的
Specification
,其中
enumValue
任何
系统.Enum

现在,如果您在
DerivedClass
中进行派生,我无法再将任何
System.Enum
分配给
EnumClass.MyEnum规范
,而只能分配
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; }
}
公共抽象类基类,其中T:struct,IConvertible//几乎仅枚举
{
公共抽象T规范{get;set;}
}
公共类派生类:基类
{
公共EnumClass.MyEnum规范{get;set;}
}

不幸的是,
其中T:enum
是不可能的,因此仍然有可能将其他
IConvertible
结构
传递给泛型类型参数。

如果要更改重写中的属性类型,则无法执行。必须完全匹配。心存感激。想象一下,你可以用这个写一些过度设计的噩梦。你正在改变覆盖中的属性类型,这是不可能的。必须完全匹配。心存感激。想象一下,你可以用这个来写那些过度设计的噩梦。谢谢,这是有道理的。我想确保任何派生类都有一个Specification属性,但它们都有自己的不同规范的枚举。一定有更好的方法吗?@KevinMarsh:你可以使用泛型。我会更新我的回答谢谢这正是我想要的汉克斯,这是有道理的。我想确保任何派生类都有一个Specification属性,但它们都有自己的不同规范的枚举。一定有更好的方法吗?@KevinMarsh:你可以使用泛型。我会更新我的回答谢谢这正是我想要的