我正在学习使用Java的SOLID原则,我正在尝试使用它来实现两个类。我的问题是关于ISP。我有一些方法存在于一个类但不存在于另一个类中,我还必须使用相同的接口引用这两个类。 这是第一堂课:
public final class Complex implements Number {
@Override
public String polarForm() {
//This class needs to implement this method
}
@Override
public String rectangularForm() {
//This class needs to implement this method
}
}
这是第二个:
public final class Real implements Number {
@Override
public String polarForm() {
//This class does not need this method!
}
@Override
public String rectangularForm() {
//This class does not need this method!
}
}
最后,我必须引用类似这样的类:
public static void main(String[] args) {
Number c = new Complex();
Number r = new Real();
Number n = c.add(r);
System.out.println(c.polarForm());
System.out.println(n);
}
如何在不实现不必要的方法的情况下引用具有相同接口的两个类?
答案 0 :(得分:2)
将您的Number
接口(或基类)分成多个接口。标准操作(加,减等)合二为一;让我们说INumber
。 polarForm
和rectangularForm
是另一个人的一部分;让我们说IComplex
。
Real
将实施INumber
; Complex
会实施INumber
和Icomplex
。然后,您可以将它们都视为INumber
。
如有必要,您还可以创建另一个实现这两者的界面。
答案 1 :(得分:2)
解决此问题的另一种解决方案是将 Composition 而不是 Inhertiance 与接口隔离原则结合使用。
数字等级
public class Number {
private RectangleForm rectangleForm;
private PolarForm polarForm;
private BigDecimal value;
public Number(RectangleForm rectangleForm, PolarForm polarForm,BigDecimal value) {
this.rectangleForm = rectangleForm;
this.polarForm = polarForm;
this.value = value;
}
public String polarForm() {
return polarForm.transform(this.value);
}
public String rectangleForm() {
return rectangleForm.transform(this.value);
}
//other methods such as add and subtract
}
PolarForm界面
public interface PolarForm {
public String transform(BigDecimal number);
}
RectangularForm接口
public interface RectangleForm {
public String transform(BigDecimal number);
}
实数的RectangleForm实现
public class RectangleFormReal implements RectangleForm {
@Override
public String transform(BigDecimal number) {
String transformed = "";
//transfromed = logic to transform to rectangle form
return transformed;
}
}
实数的PolarForm实现
public class PolarFormReal implements PolarForm {
@Override
public String transform(BigDecimal number) {
//return the number as is without any transformation
return number.toString();
}
}
将各个部分放在一起
public class NumberTest {
public static void main(String[] args) {
RectangleForm rf = new RectangleFormReal();
PolarForm pf = new PolarFormReal();
Number number = new Number(rf, pf,new BigDecimal(10));
String rectangleForm = number.rectangleForm();
String polarForm = number.polarForm();
}
}
您可以创建PolarFormComplex
和RectangleFormComplex
实现,并以类似的方式连接Number
实例。这种方法的优点是你的代码总是依赖于Number
类的接口(通过接口我的意思是公共API),你可以通过注入相应的PolarForm
或{来选择转换策略。 {1}}实例在编译时编译到RectangleForm
实例,如上所示或在运行时(通过工厂)