37

我有一个“米”课。“meter”的一个属性是另一个称为“production”的类。我需要通过引用从生产类访问仪表类(额定功率)的属性。在 Meter 实例化时,powerRating 是未知的。

我怎样才能做到这一点 ?

提前致谢

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

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

7 回答 7

47

将仪表实例的引用存储为生产中的成员:

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 类可以实际访问 Meter 类的 powerRating 成员。

于 2009-12-21T13:49:02.207 回答
36

我不会直接在子对象中引用父对象。在我看来,孩子不应该知道父母的任何事情。这将限制灵活性!

我会用事件/处理程序解决这个问题。

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

这看起来与解决方案提到的几乎相同,但接口可以在另一个程序集中定义,并且可以由多个类实现。


问候,杰伦·范·朗根。

于 2012-08-17T08:38:59.917 回答
10

您需要向 Production 类添加一个属性并将其设置为指向其父级,默认情况下不存在。

于 2009-12-21T13:45:59.860 回答
3

为什么不改变构造函数Production让你在构造时传入一个引用:

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

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

Production构造函数中,您可以将其分配给私有字段或属性。然后Production将始终可以访问是父级。

于 2009-12-21T13:48:44.440 回答
0

您可以向您的Production 对象添加一个名为“SetPowerRating(int)”的方法,该方法在Production 中设置一个属性,然后在使用Production 对象中的属性之前在您的Meter 对象中调用它?

于 2009-12-21T13:50:22.953 回答
0

我会给父母一个 ID,并将 parentID 存储在子对象中,这样您就可以根据需要提取有关父母的信息,而无需创建 parent-owns-child/child-owns-parent 循环。

于 2020-01-04T13:50:03.777 回答
-4

像这样的东西:

  public int PowerRating
    {
       get { return base.PowerRating; } // if power inherits from meter...
    }
于 2009-12-21T13:48:23.443 回答