我想写一个折线类,它需要来自直线和圆弧类的功能。我知道折线有线和圆弧,因此我应该使用接口而不是扩展(我知道你不能扩展两个类)。问题是我需要为行和圆弧类编写代码,并且我希望尽可能避免在折线类中复制此代码。
有办法做到这一点吗?
以下是线类的代码片段。折线类还需要有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());
}
答案 0 :(得分:4)
由于Java不支持从多个类继承,因此可以使用Object Composition。
然后,PolyLine
类将
这样做的缺点是您的PolyLine与Line或Arc接口的一个实现相关联。您可以通过在施工期间设置它们来防止这种情况。在典型的DI环境中,实现将被注入或定位,而不是硬连线。
行:接口和实现:
// Interface: Line.java
public interface Line
{
void lineMethod();
}
// Implementation: DefaultLine.java
public class DefaultLine implements Line
{
public void lineMethod()
{
}
}
Arc:界面和实现
// Interface: Arc.java
public interface Arc
{
void arcMethod();
}
// Implementation: DefaultArc.java
public class DefaultArc implements Arc
{
public void arcMethod()
{
}
}
PolyLine:接口和实现,其中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。