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

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

Comment puis-je faire ça ?

Merci d'avance

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

   public Meter()
   {
      _production = new Production();
   }
}
24
demandé sur edosoft 2009-12-21 16:42:52

6 réponses

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

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

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

Puis dans la classe de compteur:

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 de Production puisse accéder au membre powerRating de la classe Meter.

34
répondu Christian 2009-12-21 13:49:02

Je ne référencerais pas le parent directement dans les objets enfants. À mon avis, les enfants ne devraient rien savoir sur les 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 Func generic, mais peut être fait avec des fonctions 'normales'. C'est pourquoi l'enfant(Production) est totalement indépendant de son parent (mètre).


Mais! Si il y a trop d'événements/gestionnaires ou vous voulez juste 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 de 1 classe.


Cordialement, Jeroen van Langen.

27
répondu Jeroen 2012-08-17 08:38:59

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

9
répondu bwarner 2009-12-21 13:45:59

Pourquoi ne pas changer de constructeur, sur Production pour vous permettre de 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é. Alors Production aura toujours accès à Is parent.

3
répondu Rob Levine 2009-12-21 13:48:44

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

0
répondu Gary Willoughby 2009-12-21 13:50:22

Quelque Chose comme ceci:

  public int PowerRating
    {
       get { return base.PowerRating; } // if power inherits from meter...
    }
-3
répondu Tony The Lion 2009-12-21 13:48:23