如何在编写接口时避免重复代码?

时间:2013-04-19 02:18:29

标签: java inheritance interface

我想写一个折线类,它需要来自直线和圆弧类的功能。我知道折线线和圆弧,因此我应该使用接口而不是扩展(我知道你不能扩展两个类)。问题是我需要为行和圆弧类编写代码,并且我希望尽可能避免在折线类中复制此代码。

有办法做到这一点吗?

以下是线类的代码片段。折线类还需要有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());
}

1 个答案:

答案 0 :(得分:4)

由于Java不支持从多个类继承,因此可以使用Object Composition

然后,PolyLine类将

  • 实现Line和Arc接口
  • 由Line和Arc实现组成。
  • 将对行和弧接口中的方法的调用委托给相应的对象。

这样做的缺点是您的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。