Runnableインターフェイスを実装する抽象的なBaseクラスがあるとしましょう。Javaのコンストラクタから抽象メソッドを呼び出すことはできますか?
public abstract class Base implements Runnable {
protected int param;
public Base(final int param) {
System.out.println("Base constructor");
this.param = param;
// I'm using this param here
new Thread(this).start();
System.out.println("Derivative thread created with param " + param);
}
@Override
abstract public void run();
}
ここでは、いくつかの派生クラスの1つです。
public class Derivative extends Base {
public Derivative(final int param) {
super(param);
}
@Override
public void run() {
System.out.println("Derivative is running with param " + param);
}
public static void main(String[] args) {
Derivative thread = new Derivative(1);
}
}
ポイントは、私は私の基本クラスがいくつかの一般的なものはなく、それを毎回コピーを行いたいということです。 1デリバティブ はPARAM 1
で実行されている。しかし、それはJavaで安全であるのparamで作成したデリバティブスレッドは、スレッドが呼び出しを開始する
基本コンストラクタ:実は は、出力が常に同じで、細かい動作していますコンストラクタの抽象メソッド?なぜなら、C++やC#では、ほとんどの場合、私が知る限り安全ではないからです。 ありがとうございました!
コンストラクタがコンストラクタから呼び出すことができ、そのようなコンテキストから呼び出すことが安全でなければならず、同様に他のメソッドしか呼び出せないと指定した抽象メソッドまたは仮想メソッド*を呼び出すことについては、安全*? – supercat
@supercat:文書をどのくらい信頼しているか、他の人がそのような文書に従うことをどれほど信頼するか、またそのようなクラスやそのサブクラスを拡張して、適切に伝播したり覚えている人そのような警告を参照してください。それは私の意見ではかなりの信頼です。私は、自動化されたテストによって証明できるものを好んでおり、それはできません。 –
十分に良い。私が念頭に置いていた最大の使用例は、派生クラスが、各サブクラスのすべてのインスタンスに対して同じでなければならない定数を返すメソッドをオーバーライドすることが予想され、コンストラクタやその他の場所で必要とされる場合、典型的な実装は 'int getWoozleForType(){return 23;}'です。そのようなものをコンストラクタに渡してインスタンスフィールドに格納するのはちょっと厄介なようですが、私はどちらかを招待しているようなアプローチは考えられません。 – supercat