Je ne ferais pas référence au parent directement 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 Func <> générique, mais peut être fait avec des fonctions « normales ». C'est pourquoi l'enfant (Production) est totalement indépendant de son parent (Meter).
But! S'il y a trop d'événements/gestionnaires ou vous voulez juste passer un objet parent, je résoudraient 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 la même chose que la solution mentionne, mais pourrait être défini l'interface dans un autre assemblage et peut être mis en œuvre par plus de 1 classe.
Cordialement, Jeroen van Langen.
Copie possible de [Quelle est la meilleure façon d'accéder au champ dans la classe englobante de la classe imbriquée?] (Http://stackoverflow.com/questions/185124/whats-the-best-way-of-accessing-field -in-the-enclosing-class-from-the-nested-cl) –
@JimFell Ceci n'implique pas du tout les classes imbriquées – Rob