1

我想编写一个折线类,它需要直线和圆弧类的功能。我知道折线直线和圆弧,因此我应该使用接口而不是扩展(我知道你不能扩展两个类)。问题是我还需要为直线和圆弧类编写代码,如果可能的话,我想避免在折线类中复制这些代码。

有没有办法做到这一点?

这是来自 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());
}
4

1 回答 1

4

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

然后,PolyLine班级将

  • 实现 Line 和 Arc 接口
  • 由 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。

于 2013-04-19T02:26:49.193 回答