我在如何使用适当的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;
}
}
答案 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
的情况下,Battery
和Resistor
您的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;
}
但是,如果Battery
和Resistor
都是预期值,那么您将使用合成,因此您必须创建一个Circut
构造函数,同时接受这两个组件参数而不是设置它们。
答案 2 :(得分:1)
在这种情况下,您可以使用聚合。
您应该添加一个电池字段和一个包含容器(例如List)的字段,其中包含Circuit类中的电阻。 您可以在Curcuit类之外初始化它们,并使用参数将它们传递给Circuit-Constructor。
答案 3 :(得分:0)