Подтвердить что ты не робот

Как получить доступ к родительскому объекту в С#

У меня есть класс "метр". Одним из свойств "метра" является другой класс под названием "производство". Мне нужно получить доступ к классу класса (класс мощности) класса производительности с помощью ссылки. PowerRating не известно при создании Meter.

Как я могу это сделать?

Заранее спасибо

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

   public Meter()
   {
      _production = new Production();
   }
}
4b9b3361

Ответ 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...
    }