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

标签 java inheritance interface

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

相关文章:

Java 与 C(运行时)编辑 : Added Code

java - 尝试在 springboot 中使用 AuthenticationManager 对用户进行身份验证时出现 Stackoverflow 错误

C# 继承保护方法实现接口(interface)

javascript - 你能用 jquery 获取继承的元素类吗?

c# - 如何在 WCF 中使用接口(interface)作为数据契约

java - 将新的 JavaDoc 附加到来自 super 方法的现有 JavaDoc

java - 无模式 JDialog 需要在父级之上可见

java - Tapestry5 : loop, 访问表达式中的值

python - 在继承的情况下为 kwargs 输入 Mypy

c# - 为什么接口(interface)不能指定静态方法?