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

时间:2017-07-30 21:12:04

标签: c# inheritance override

我对C#很新,所以要温柔 我的最终目标是为继承提供几种不同类型的类(例如: Level )。这些继承的类做两件事,具有.Value属性,具有不同的setter,具体取决于类,以及.Action方法,对于每个实例都是唯一的,因此它是一个覆盖。

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

 Potentiometer.Value = Convert.ToDouble(data);
// Code taken from https://dotnetfiddle.net/YNJpjf
using System;

namespace Main {
    class Program
    {
        static Device device = new Device();

        static void Main(string[] args)
        {
            device.HandleDataUpdate("50");
        }

    }

    public class Device
    {
        public class Potentiometer : Level
        {
            public override void Action()
            {
                Console.WriteLine("value is at: {0}", this.Value);
            }
        }

        public void HandleDataUpdate(String data)
        {
            Potentiometer.Value = Convert.ToDouble(data);
        }
    }

    public class Level
    {
        private Double thisValue;
        public Double Value
        {
            get => thisValue;
            set
            {
                if (thisValue != value)
                {
                    thisValue = value;
                    Action();
                }
            }
        }

        public virtual void Action()
        {

        }
    }
}

3 个答案:

答案 0 :(得分:1)

Level提供受保护的抽象方法OnSetValue,强制每个子类覆盖它。现在,Value的设置者可以在设置值之前调用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) {
        ...
    }
}

答案 1 :(得分:0)

您需要创建一个电位计实例。

https://dotnetfiddle.net/8JQDyO

答案 2 :(得分:0)

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