No haría referencia al elemento primario directamente en los objetos secundarios. En mi opinión, los niños no deberían saber nada sobre los padres. ¡Esto limitará la flexibilidad!
Resolvería esto con eventos/controladores.
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;
}
En este caso lo resolví con el Func <> genérico, pero se puede hacer con las funciones 'normales'. Este es el motivo por el cual el niño (Producción) es totalmente independiente de su padre (Medidor).
But! Si hay demasiados eventos/manejadores o simplemente quieren pasar un objeto padre, lo resolvería con una interfaz:
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);
}
}
Esto se ve más o menos la misma que la solución menciona, pero la interfaz se podría definir en otro ensamblado y puede implementarse en más de 1 clase.
Saludos, Jeroen van Langen.
Posible duplicado de [¿Cuál es la mejor forma de acceder al campo en la clase adjunta de la clase anidada?] (Http://stackoverflow.com/questions/185124/whats-the-best-way-of-accessing-field -en-la-clase-envolvente-desde-la-anidada-cl) –
@JimFell Esto no implica clases anidadas en absoluto – Rob