背景
我有一个基类,N个子类,每个子类有一个优先级字段,通过这个优先级字段我会对比每个子类。这个字段是不需要变的。
继承与静态变量
然后我选择静态变量,因为这个这个字段不会变,和类对象无关,于是我将其声明为静态,并放到父类中。
作为一个C# “老司机”,今天也调到一个语法的坑里。
对于静态变量而言:
在子类中修改了继承自父类的静态字段,父类的静态字段也会被修改。
子类继承的静态变量,并不属于子类,仍然属于父类。
而我以为继承的静态字段有子类的独立空间,其实不是。所以想有独立空间,就必须用非静态变量。
Readonly 和 Init-only
于是我就想到了Readonly,但是这个字段放到父类后,子类无法再对它赋值了。(子类需要对它赋值,每个子类需要一个不同的优先级)。
于是就发现了,一个新的语法 Init-only :
普通属性写法
public double Priority { get; set; } = 1;
特殊写法 Init-only (将set 换成了 init,感觉很好理解)
public int Priority { get; init; }
于是我将 public int Priority { get; init; } 放到父类中
这样子类在构造时就可以对Priority进行赋值,有且只能赋值一次!