Polymorphi c (новое) изменяющее значение поля в базовом классе - PullRequest
0 голосов
/ 22 марта 2020

Важно: я не могу использовать свойства, мне нужно сериализовать поле. C# 6.0

Все просто, поле определено в базовом классе, а другой класс наследует это поле от базового класса. Поле в подклассе меняет его тип - важно, чтобы тип всегда был enum, но сериализация зависит от типа enum, поэтому он должен быть строго типизирован. Затем изменение значения в базовом классе ожидает того же самого изменения в подклассе, вызывая некоторый метод в подклассе. Этого не происходит, потому что поле помечено как новое, поэтому у него есть собственное распределение памяти. Как изменить это поведение, не сообщая подклассу значение клона?

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);
    }
}

1 Ответ

0 голосов
/ 22 марта 2020

Вы можете быть довольно близко, используя Generics. Начиная с c# 7.3, вы можете использовать обобщенное c ограничение для 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 */}

Теперь FooWrapper и BarWrapper являются братьями и сестрами, поэтому они не наследуйте друг друга, но они оба наследуют класс Base<T>, а тот наследует Base класс`

...