gpt4 book ai didi

java - 编写接口(interface)时如何避免重复代码?

转载 作者:行者123 更新时间:2023-11-29 03:34:52 24 4
gpt4 key购买 nike

我想编写一个折线类,它需要线和圆弧类的功能。我知道折线线和圆弧因此我应该使用接口(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com