具有子类和继承的C#类:在继承的类中设置值

具有子类和继承的C#类:在继承的类中设置值,c#,inheritance,overriding,C#,Inheritance,Overriding,我对C#还比较陌生,所以要温柔。 我的最终目标是有几种不同类型的类用于继承(下面的示例:Level)。这些继承的类做两件事:根据类的不同,具有具有不同setter的.Value属性;以及对于每个实例都是唯一的.Action方法,因此它是一个重写。 问题:如何从类的方法设置.Value属性。这是下面示例中不起作用的代码行(第27行)。我不明白为什么 Potentiometer.Value = Convert.ToDouble(data); 您需要创建电位计的实例 为级别提供一个受保护的抽象

我对C#还比较陌生,所以要温柔。
我的最终目标是有几种不同类型的类用于继承(下面的示例:Level)。这些继承的类做两件事:根据类的不同,具有具有不同setter的.Value属性;以及对于每个实例都是唯一的.Action方法,因此它是一个重写。

问题:如何从类的方法设置.Value属性。这是下面示例中不起作用的代码行(第27行)。我不明白为什么

 Potentiometer.Value = Convert.ToDouble(data);


您需要创建电位计的实例

级别提供一个受保护的抽象方法
OnSetValue
,强制每个子类重写它。现在,
Value
的setter可以在设置值之前调用
OnSetValue

public class Level {
    private double val;
    public double Value {
        get {
            return val;
        }
        set {
            OnSetValue(value);
            val = value;
        }
    }
    protected abstract void OnSetValue(double val);
    ...
}
public class Potentiometer : Level {
    protected void OnSetValue(double val) {
        ...
    }
}

您试图设置类字段的值,这是不可能的,而不是对象字段的值。您必须在
设备
中创建
电位计
的实例,如果您想这样做,您可以创建方法或更改代码逻辑。

为什么在
设备
中声明
电位计
类?
public class Level {
    private double val;
    public double Value {
        get {
            return val;
        }
        set {
            OnSetValue(value);
            val = value;
        }
    }
    protected abstract void OnSetValue(double val);
    ...
}
public class Potentiometer : Level {
    protected void OnSetValue(double val) {
        ...
    }
}