基础 class 中的多态(新)字段更改值

Polymorphic (new) field changing value in base class

重要提示:我不能使用属性,我需要序列化字段。 C# 6.0

东西很简单,字段在基class中定义,另一个class从基class继承这个字段。 subclass 中的字段更改其类型 - 重要的是类型始终是枚举,但序列化取决于枚举类型,因此它必须是强类型的。然后通过调用 subclass 中的一些方法,改变 base class 中的值期望 subclass 中的相同变化。它没有发生,因为字段被标记为新的,所以它有自己的内存分配。如何在不告诉 subclass 克隆值的情况下更改此行为?

enum Foo { };
enum Bar { };

abstract class Base
{
    protected Foo someEnum;

    public void Load(int someVal)
    {
        someEnum = (Foo)someVal;
    }
}

class Child : Base
{
    public new Bar someEnum;
}

class Program
{
    void Main()
    {
        var c = new Child();
        c.Load(7);

        Assert((int)c.someEnum == 7);
    }
}

您可以非常接近使用泛型。 从 c# 7.3 开始,您可以对 Enum 使用通用约束 - 这样您就可以执行以下操作:


abstract class Base {
    public abstract void Load(int someVal);
}

class Base<T> : Base
    where T : Enum
{
    protected T someEnum;

    public override void Load(int someVal)
    {
        someEnum = (T)someVal;
    }
}

class FooWrapper : Base<Foo> {/* implementation */}

class BarWrapper : Base<Bar> {/* implementation */}

现在 FooWrapperBarWrapper 是兄弟姐妹,所以他们不继承彼此,但他们都继承了 Base<T> class 并且继承了 Base class`