我想编写一个折线类,它需要线和圆弧类的功能。我知道折线有线和圆弧因此我应该使用接口(interface)而不是扩展(我知道你不能扩展两个类)。问题是我还需要为线和圆弧类编写代码,并且我希望尽可能避免在折线类中重复此代码。
有办法吗?
这是 line 类中的一段代码。折线类还需要有 getMidPoint()、containsPoint(x,y) 等。我还没有编写圆弧的代码,但它具有类似的功能 getMidPoint()、containsPoint(x,y)。
public Line (double x1,double y1, double x2,double y2){
super (x1,y1,x2,y2);
}
public ACSPoint getMidPoint(){
ACSPoint p = new ACSPoint();
p.x((this.start.x()+this.end.x())/2);
p.y((this.start.y()+this.end.y())/2);
return p;
}
@Override
public boolean containsPoint(double x, double y){
boolean containsPoint = super.containsPoint(x, y);
if (containsPoint){
if (x<this.start.x()||x>this.end.x()){
return false;
}
}
return containsPoint;
}
@Override
public boolean containsPoint(ACSPoint p){
return this.containsPoint(p.x(), p.y());
}
最佳答案
由于 Java 不支持从多个类继承,您可以使用 Object Composition .
然后,PolyLine
类将
- 实现直线和弧形接口(interface)
- 由 Line 和 Arc 实现组成。
- 将对线和弧接口(interface)中方法的调用委托(delegate)给相应的对象。
这样做的缺点是您的 PolyLine 绑定(bind)到 Line 或 Arc 接口(interface)的一种实现。您可以通过允许在构造期间设置它们来防止这种情况发生。在典型的 DI 环境中,实现将被注入(inject)或定位,而不是硬连接它们。
行:接口(interface)和实现:
// Interface: Line.java public interface Line { void lineMethod(); } // Implementation: DefaultLine.java public class DefaultLine implements Line { public void lineMethod() { } }
Arc:接口(interface)和实现
// Interface: Arc.java public interface Arc { void arcMethod(); } // Implementation: DefaultArc.java public class DefaultArc implements Arc { public void arcMethod() { } }
PolyLine:接口(interface)和实现,其中 Line 和 Arc 的实现是硬连线的:
public interface PolyLine extends Line, Arc { } public class DefaultPolyLine implements PolyLine { private Line line; private Arc arc; public DefaultPolyLine() { line = new DefaultLine(); arc = new DefaultArc(); } public void lineMethod() { line.lineMethod(); } public void arcMethod() { arc.arcMethod(); } }
在构造期间设置 Line 和 Arc 实现的 PolyLine 实现:
public class DefaultPolyLine implements PolyLine { private Line line; private Arc arc; public DefaultPolyLine(Line line, Arc arc) { this.line = line; this.arc = arc; } public void lineMethod() { line.lineMethod(); } public void arcMethod() { arc.arcMethod(); } }
PolyLine
的最后一个实现允许客户端设置任何 Line 实现,而不是总是使用 DefaultLine
实现,这同样适用于 Arc。
关于java - 编写接口(interface)时如何避免重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16096167/