使用接口的抽象类或公共方法

时间:2016-05-23 07:59:14

标签: java inheritance methods interface abstract-class

Shape.java

public interface Shape {
    String draw();

    void calcSomething();
}

Square.java

public class Square implements Shape {
    @Override
    public String draw() {
        return "SQUARE";
    }

    @Override
    public void calcSomething() {

    }
}

当我实施interface时,我实施的方法必须是public

我想制作draw()公开方法,但calcSomething() 私有或受保护

我经历过Interfaces in Java: cannot make implemented methods protected or private 。并没有直接的方法来做到这一点

因此,我不打算使用接口,而是计划使用抽象类

使用抽象类

Shape.java

public abstract class Shape {
    abstract public String draw();

    abstract protected void calcSomething();
}

Square.java 实施Shape 抽象类

public class Square extends Shape {
    @Override
    public String draw() {
        return "SQUARE";
    }

    @Override
    protected void calcSomething() {

    }
}

我应该选择哪一个。我应该使用界面并使calcSomething() 公开,还是应该使用抽象类并使calcSomething() 保护

1 个答案:

答案 0 :(得分:2)

引用The Java™ Tutorials - What Is an Interface?

  

实现一个接口允许一个类对它承诺提供的行为变得更加正式。接口在类和外部世界之间形成合同

为了让外界访问这些方法,它们必须是公开的。

如果您不希望该方法是公共的,即可以从外部世界调用,则它不属于该接口。

如果您希望calcSomething()中的其他代码可以调用Shape,那么......哎呀,Shape中没有其他代码。这是一个界面 好的,如果您希望calcSomething()可以从Square中的其他代码调用,则需要它是抽象(或存根)方法。这就是template method pattern的工作原理。