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

问题描述 投票:0回答:1

重要:我无法使用属性,我需要序列化字段。 C#6.0

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

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# polymorphism derived-class base-class
1个回答
0
投票

您可以使用泛型获得相当接近的效果。从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>类并且继承了Base类`

© www.soinside.com 2019 - 2024. All rights reserved.