基础 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 */}
现在 FooWrapper
和 BarWrapper
是兄弟姐妹,所以他们不继承彼此,但他们都继承了 Base<T>
class 并且继承了 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 */}
现在 FooWrapper
和 BarWrapper
是兄弟姐妹,所以他们不继承彼此,但他们都继承了 Base<T>
class 并且继承了 Base
class`