就在我开始熟悉接口时,我遇到了抽象类的绊脚石。在我的理解中,它们可以用来为子类提供一些功能,但强制子类指定未定义的函数(如果有的话)。
然而,我遇到的所有示例都只处理可能是静态的功能 - 没有引用实例变量。
我试图隐藏getName()
抽象类中的一些常见函数,但能够在子类中定义所述名称。
public interface Application {
public String getName();
}
/**
* Specify some default behaviour to keep leaf classes free of common code
*/
public abstract class DefaultApplication implements Application {
public static final String NAME = "DefApp";
@Override
public String getName() {
return NAME;
}
}
public class MyApp extends DefaultApplication {
public static final String NAME = "My App";
}
// Main class
Application myApp = new MyApp();
System.out.println(myApp.getName()); // Prints "DefApp"
我认为这protected String name
可能有效,但这也会返回抽象类中的实例变量。getName()
是在每个子类中重新定义的唯一解决方案吗?我不会这么介意,但这不是我试图将方法虹吸到抽象类中的唯一情况。
谢谢!
编辑:
如果相关(建议我可以考虑的其他方法),Application 是一个插件 api,而 MyApp 是一个提供的示例应用程序。DefaultApplication 是基础项目的一部分。