Как получить доступ к родительскому объекту в C # - PullRequest
29 голосов
/ 21 декабря 2009

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

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

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

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

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

Ответы [ 6 ]

39 голосов
/ 21 декабря 2009

Сохранение ссылки на экземпляр счетчика в качестве члена в Production:

public class Production {
  //The other members, properties etc...
  private Meter m;

  Production(Meter m) {
    this.m = m;
  }
}

А потом в Метр-классе:

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

   public Meter()
   {
      _production = new Production(this);
   }
}

Также обратите внимание, что вам необходимо реализовать метод / свойство аксессора, чтобы класс Production мог реально получить доступ к члену powerRating класса Meter.

31 голосов
/ 17 августа 2012

Я бы не стал ссылаться на родителя непосредственно в дочерних объектах. По моему мнению, дети не должны ничего знать о родителях. Это ограничит гибкость!

Я бы решил это с помощью событий / обработчиков.

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);
    }
}

Это выглядит почти так же, как упоминается в решении, но интерфейс может быть определен в другой сборке и может быть реализован несколькими классами.


С уважением, Йерун ван Ланген.

9 голосов
/ 21 декабря 2009

Вам нужно добавить свойство в свой класс Production и установить его так, чтобы оно указывало на его родительский класс, по умолчанию оно не существует.

3 голосов
/ 21 декабря 2009

Почему бы не изменить конструктор на Production, чтобы позволить вам передать ссылку во время создания:

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

   public Meter()
   {
      _production = new Production(this);
   }
}

В конструкторе Production вы можете назначить это частному полю или свойству. Тогда Production всегда будет иметь доступ к родителю.

0 голосов
/ 21 декабря 2009

Возможно, вы могли бы добавить метод к вашему объекту Production с именем SetPowerRating (int), который устанавливает свойство в Production, и вызвать его в вашем объекте Meter перед использованием свойства в объекте Production?

0 голосов
/ 21 декабря 2009

как то так:

  public int PowerRating
    {
       get { return base.PowerRating; } // if power inherits from meter...
    }
...