2017-07-30 85 views
0

我對C#相當新,所以要溫和。
我的最終目標是有幾個不同類型的繼承(例如:級別)。這些繼承的類做了兩件事,具有.Value屬性,具有取決於類的不同setter和.Action方法,對每個實例都是唯一的,因此它是重寫。

問題:如何設置。值屬性來自類上的方法。這是代碼行(第27行),下面的示例不起作用。我不明白爲什麼。C#類與子類和繼承:在繼承類中的設置值

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() 
     { 

     } 
    } 
} 
+0

爲什麼在'Device'裏聲明'Potentiometer'類? – ja72

回答

0

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) { 
     ... 
    } 
} 
0

你試圖設置類字段,這是不可能的,而不是對象的字段的值。您必須在Device內部創建Potentiometer實例,如果您想這樣做,則可以製作方法或更改代碼邏輯。