Как получить доступ к родительскому объекту в С#
У меня есть класс "метр". Одним из свойств "метра" является другой класс под названием "производство".
Мне нужно получить доступ к классу класса (класс мощности) класса производительности с помощью ссылки. PowerRating не известно при создании Meter.
Как я могу это сделать?
Заранее спасибо
public class Meter
{
private int _powerRating = 0;
private Production _production;
public Meter()
{
_production = new Production();
}
}
Ответы
Ответ 1
Сохраните ссылку на экземпляр счетчика в качестве члена в разделе "Производство":
public class Production {
//The other members, properties etc...
private Meter m;
Production(Meter m) {
this.m = m;
}
}
И затем в классе Meter:
public class Meter
{
private int _powerRating = 0;
private Production _production;
public Meter()
{
_production = new Production(this);
}
}
Также обратите внимание, что вам необходимо реализовать метод/свойство accessor, чтобы класс Production мог фактически получить доступ к элементу powerRating класса Meter.
Ответ 2
Я не буду ссылаться на родителя непосредственно в дочерних объектах. По-моему, дети не должны знать ничего о родителях. Это ограничит гибкость!
Я бы решил это с помощью событий/обработчиков.
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 < > generic, но может быть выполнен с "нормальными" функциями.
Это почему ребенок (Production) полностью независим от него родительского (Meter).
Но! Если слишком много событий/обработчиков или вы просто хотите передать родительский объект, я бы решил его с помощью интерфейса:
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);
}
}
Это выглядит примерно так же, как упоминается в решении, но интерфейс может быть определен в другой сборке и может быть реализован более чем в 1 классе.
С уважением,
Йерун ван Ланген.
Ответ 3
Вам нужно добавить свойство в свой класс Production и установить его на родительский элемент, это не существует по умолчанию.
Ответ 4
Почему бы не изменить конструктор на Production
, чтобы вы могли передать ссылку во время построения:
public class Meter
{
private int _powerRating = 0;
private Production _production;
public Meter()
{
_production = new Production(this);
}
}
В конструкторе Production
вы можете назначить это частному полю или свойству. Тогда Production
всегда будет иметь доступ к родительскому.
Ответ 5
Возможно, вы могли бы добавить метод к вашему объекту Production с именем "SetPowerRating (int)", который устанавливает свойство в разделе "Производство" и вызывает это в объекте Meter перед использованием свойства в объекте "Производство"?
Ответ 6
что-то вроде этого:
public int PowerRating
{
get { return base.PowerRating; } // if power inherits from meter...
}