インターフェイスに慣れ始めたちょうどその頃、抽象クラスに関するつまずきに出くわしました。私の理解では、それらはサブクラスにいくつかの機能を提供するために使用できますが、サブクラスに未定義の関数を指定するように強制します(残っている場合)。
ただし、私が遭遇したすべての例は、静的である可能性のある機能のみを扱っており、インスタンス変数への参照はありません。
抽象クラスのようないくつかの一般的な関数を隠そうとして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()
各サブクラスで再定義する唯一の解決策はありますか? 私はそれほど気にしませんでしたが、メソッドを抽象クラスに吸い上げようとしているのはこれだけではありません。
ありがとう!
EDIT:
関連する場合(私が検討できる他のアプローチを提案するため)、ApplicationはプラグインAPIであり、MyAppは提供されるサンプルアプリケーションです。DefaultApplication は基本プロジェクトの一部です。