web-dev-qa-db-fra.com

Comment accéder à l'objet parent en c #

J'ai un cours de "mètre". Une propriété du "mètre" est une autre classe appelée "production". J'ai besoin d'accéder à une propriété de classe de compteur (puissance nominale) de la classe de production par référence . Le powerRating n'est pas connu lors de l'instanciation de Meter.

Comment puis je faire ça ?

Merci d'avance

public class Meter
{
   private int _powerRating = 0; 
   private Production _production;

   public Meter()
   {
      _production = new Production();
   }
}
29
Jean Duprez

Stockez une référence à l'instance de compteur en tant que membre dans Production:

public class Production {
  //The other members, properties etc...
  private Meter m;

  Production(Meter m) {
    this.m = m;
  }
}

Et puis dans la classe Meter:

public class Meter
{
   private int _powerRating = 0; 
   private Production _production;

   public Meter()
   {
      _production = new Production(this);
   }
}

Notez également que vous devez implémenter une méthode/propriété d'accesseur afin que la classe Production puisse réellement accéder au membre powerRating de la classe Meter.

41
Christian

Je ne ferais pas référence directement au parent dans les objets enfants. À mon avis, les enfants ne devraient rien savoir des parents. Cela limitera la flexibilité!

Je résoudrais cela avec des événements/gestionnaires.

public class Meter
{
    private int _powerRating = 0;
    private Production _production;

    public Meter()
    {
        _production = new Production();
        _production.OnRequestPowerRating += new Func<int>(delegate { return _powerRating; });
        _production.DoSomething();
    }
}

public class Production
{
    protected int RequestPowerRating()
    {
        if (OnRequestPowerRating == null)
            throw new Exception("OnRequestPowerRating handler is not assigned");

        return OnRequestPowerRating();
    }

    public void DoSomething()
    {
        int powerRating = RequestPowerRating();
        Debug.WriteLine("The parents powerrating is :" + powerRating);

    }

    public Func<int> OnRequestPowerRating;
}

Dans ce cas, je l'ai résolu avec le générique Func <>, mais cela peut être fait avec des fonctions "normales". C'est pourquoi l'enfant (Production) est totalement indépendant de son parent (Mètre).


Mais! S'il y a trop d'événements/gestionnaires ou si vous voulez simplement passer un objet parent, je le résoudrais avec une interface:

public interface IMeter
{
    int PowerRating { get; }
}

public class Meter : IMeter
{
    private int _powerRating = 0;
    private Production _production;

    public Meter()
    {
        _production = new Production(this);
        _production.DoSomething();
    }

    public int PowerRating { get { return _powerRating; } }
}

public class Production
{
    private IMeter _meter;

    public Production(IMeter meter)
    {
        _meter = meter;
    }

    public void DoSomething()
    {
        Debug.WriteLine("The parents powerrating is :" + _meter.PowerRating);
    }
}

Cela ressemble à peu près à ce que mentionne la solution, mais l'interface peut être définie dans un autre assembly et peut être implémentée par plus d'une classe.


Cordialement, Jeroen van Langen.

31
Jeroen

Vous devez ajouter une propriété à votre classe Production et la définir pour qu'elle pointe vers son parent, cela n'existe pas par défaut.

9
bwarner

Pourquoi ne pas changer le constructeur sur Production pour vous laisser passer une référence au moment de la construction:

public class Meter
{
   private int _powerRating = 0; 
   private Production _production;

   public Meter()
   {
      _production = new Production(this);
   }
}

Dans le constructeur Production, vous pouvez l'affecter à un champ privé ou à une propriété. Ensuite, Production aura toujours accès à son parent.

3
Rob Levine

Vous pouvez peut-être ajouter une méthode à votre objet Production appelée "SetPowerRating (int)" qui définit une propriété dans Production, et l'appeler dans votre objet Meter avant d'utiliser la propriété dans l'objet Production?

0
Gary Willoughby