Я бы не стал ссылаться на родителя непосредственно в дочерних объектах. По моему мнению, дети не должны ничего знать о родителях. Это ограничит гибкость!
Я бы решил это с помощью событий / обработчиков.
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;
}
В этом случае я решил это с помощью универсального Func <>, но это можно сделать с помощью «обычных» функций.
Вот почему ребенок (Производство) полностью независим от своего родителя (Метр).
Но! Если есть слишком много событий / обработчиков или вы просто хотите передать родительский объект, я бы решил это с помощью интерфейса:
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);
}
}
Это выглядит почти так же, как упоминается в решении, но интерфейс может быть определен в другой сборке и может быть реализован несколькими классами.
С уважением,
Йерун ван Ланген.