正确使用聚合(OOP)和电子电路类作为例子

时间:2017-02-07 21:44:16

标签: java android oop

我在如何使用适当的OOP实践来组织代码时遇到了麻烦。

假设我的电子电路由电阻器和电池等元件组成。

我肯定想要一个班级来分析整个电路的属性。但是,整个电路整体上并没有“关注”组件的属性。

我的问题是我的电池和电阻器类应该如何与电路类相互作用?

我在下面写了一些示例代码,希望能够说明我正在尝试做什么。请更正/评论实施!

public class Circuit{
     public double current;
     public double supplyVoltage;
     public int numResistors;

     public double batteryVoltage(){
          //Create battery object here? Or in its own method?
          return supplyVoltage;
          }

     public double voltageDropAcrossResistor(){
          //Use V=I*R

          //Would I create Resistor objects here? Or create a method?
          //Does the circuit object 'remember' resistor objects
          //that were created elsewhere?
     }


}

public class Resistor{
     public int resistance;

     public void setResistance(int resistance){
         this.resistance = resistance;
     }
     public int getResistance(){
         return resistance;
     }
     public String getColorCode(){
         String color = someFormula; 
         return color; 
     }

}

public class Battery{
    public int voltage;
    public String batteryType;

    public void setVoltage(int voltage){
        this.voltage = voltage; 
    }
    public int getVoltage(){
       return voltage;
    }
    public void setBatteryType(String type){
        this.batteryType = type;
    }
    public String getBatteryType(){
        return batteryType; 
    }

}

4 个答案:

答案 0 :(得分:2)

嗯,问题是Circuit没有在您的设计中聚合Battery和一堆Circuit

我希望对象引用如:

public class Circuit {
    private Battery battery;
    private List<Resistor> resistors;

    public Circuit(Battery battery, List<Resistor> resistors) {
        //...
    }

考虑到聚合,Circuit可以询问电池的电压,也可以获得电阻的电阻,以计算电压降。

  

我的问题是我的电池和电阻器类应该如何相互作用   与电路类?

双向关系通常不是必需的,也不是所希望的,特别是对于聚合,因为孩子的生命周期独立于父母。在这种情况下,电池或电阻器可能根本不必了解电路。但是,它们必须提供足够的公共接口来维护电路(或使用它们的任何其他组件)。

顺便说一句,如果你不需要电池或电阻器来拥有自己的生命周期,你应该先谈论组合而不是聚合。

答案 1 :(得分:2)

汇总是has-a关系,所以在您Circut的情况下,BatteryResistor您的Circut类可能看起来有点像这样:

private Battery battery;
private Resistor resistor;

public void addBattery(Battery battery) {
    this.battery = battery;
}

public void addResistor(Resistor resistor) {
    this.resistor = resistor;
}

所以你的返回方法看起来像这样:

public double batteryVoltage() {
    if (battery!=null) { // your formula and return value}
    return 0;
}

但是,如果BatteryResistor都是预期值,那么您将使用合成,因此您必须创建一个Circut构造函数,同时接受这两个组件参数而不是设置它们。

答案 2 :(得分:1)

在这种情况下,您可以使用聚合。

您应该添加一个电池字段和一个包含容器(例如List)的字段,其中包含Circuit类中的电阻。 您可以在Curcuit类之外初始化它们,并使用参数将它们传递给Circuit-Constructor。

答案 3 :(得分:0)

是的,你的课是聚合的一个很好的例子,因为一个A对象由B 组成 或者在你的例子中,你的电路由电池和电阻组成......

您缺少的是Battery和REsistors类型的Circuit类中的一些字段

enter image description here