首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以电子电路类为例正确使用聚合(OOP)

以电子电路类为例正确使用聚合(OOP)
EN

Stack Overflow用户
提问于 2017-02-07 21:44:15
回答 4查看 193关注 0票数 1

我很难用正确的OOP实践来组织我的代码。

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

我当然想要一个类来分析整个电路的特性。但也有一些元件的性质,作为一个整体,电路并不“关心”。

我的问题是,我的电池和电阻类应该如何与电路类交互?

下面我编写了一些示例代码,希望能说明我想要做的事情。请更正/评论实施!

代码语言:javascript
复制
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; 
    }

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-07 22:04:48

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

我期望对象引用,例如:

代码语言:javascript
复制
public class Circuit {
    private Battery battery;
    private List<Resistor> resistors;

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

在这种聚集的情况下,Circuit可以要求电池提供它的电压,也可以得到它的电阻的电阻,以便计算电压降。

我的问题是,我的电池和电阻类应该如何与电路类交互?

双向关系通常不是必需的,也不是理想的,尤其是使用聚合,因为子生命周期独立于父生命周期。在这种情况下,电池或电阻器可能根本不需要知道电路。然而,它们必须提供足够的公共接口来服务电路(或使用它们的任何其他组件)。

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

票数 2
EN

Stack Overflow用户

发布于 2017-02-07 22:07:59

聚合是has-a关系,所以在Circut中它有BatteryResistor --您的Circut类可能看起来有点像这样:

代码语言:javascript
复制
private Battery battery;
private Resistor resistor;

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

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

因此,您的返回方法将如下所示:

代码语言:javascript
复制
public double batteryVoltage() {
    if (battery!=null) { // your formula and return value}
    return 0;
}

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

票数 2
EN

Stack Overflow用户

发布于 2017-02-07 22:04:14

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

您应该添加一个电池字段和一个存放容器的字段(用于前)。包含电路类中的电阻的列表)。您可以在Curcuit类之外初始化它们,并使用参数将它们传递给电路构造器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42100589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档