2017-07-30 4 views
0

Je suis assez nouveau pour C# alors soyez gentil.
Mon but final est d'avoir quelques types de classes différents pour l'héritage (exemple ci-dessous: Niveau). Ces classes héritées font deux choses, ont une propriété .Value avec des setters différents en fonction de la classe, et une méthode .Action, unique pour chaque instance, donc c'est un override.

Question: Comment définir le .Value propriété d'une méthode de la classe. C'est la ligne de code (ligne 27) qui ne fonctionne pas à partir de l'exemple ci-dessous. Et je ne comprends pas pourquoi.Classe C# avec sous-classe et héritage: valeur de réglage dans la classe héritée

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

Pourquoi la classe 'Potentiometer' est-elle déclarée dans' Device'? – ja72

Répondre

0

Donne Level une méthode abstraite protégéOnSetValue, forçant chaque sous-classe à remplacer. Maintenant, le poseur de Value peut appeler OnSetValue avant la valeur est définie:

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

Vous essayez de définir la valeur de champ de classe, ce qui est impossible, pas du champ de l'objet. Vous devez faire une instance de Potentiometer à l'intérieur du Device, si vous voulez faire cela, vous pouvez faire une méthode ou modifier la logique du code.