私がコーディングしているJavaプロジェクトでは、コンストラクターでオーバーライドされるメソッドを使用することになりました。何かのようなもの:
class SuperClass {
SuperClass() {
intialise();
}
protected void initialise() {
//Do some stuff common to all subclasses
methodA();
methodB();
}
protected abstract void methodA();
protected abstract void methodB();
}
class SubClass1() {
SubClass() {
super();
}
protected void methodA() { //Do something }
protected void methodB() { //Do something }
}
class SubClass2() {
SubClass() {
super();
}
protected void methodA() { //Do something else }
protected void methodB() { //Do something else}
}
私の場合は正常に機能しますが、現在SuperClassオブジェクトとしてのみ構築されているオブジェクトでSubClassメソッドが呼び出されるため、多少危険であることに気付きました(SuperClassを拡張する新しいクラスが追加されると見落とされる可能性があります)未来)。また、オブジェクトの作成方法が異なるため、C++では機能しません。
これを回避するために私が考えることができる唯一の方法は、初期化メソッド呼び出しを具象クラスコンストラクターに移動することです。
class SuperClass {
SuperClass() {
}
protected void initialise() {
methodA();
methodB();
}
protected abstract void methodA();
protected abstract void methodB();
}
class SubClass1() {
SubClass() {
super();
initialise();
}
protected void methodA() { //Do something }
protected void methodB() { //Do something }
}...
これは、この問題を克服するための一般的な方法ですか?SuperClassを拡張する他のすべてのクラスがinitialise()を呼び出すことを覚えておく必要があるのは、残念なことです(そして忘れがちです)。
また、コンストラクターでFactoryメソッドを使用する、より複雑な状況で同様のことを行っていることに気付きました。これは、サブクラスでオーバーライドされて、実装する具象クラスを決定します。これを回避してデザインパターンをそのまま維持するために私が考えることができる他の唯一の方法は、おそらく2段階のプロセスで構築することです。つまり、最小限で構築し、2番目のメソッドを呼び出してジョブを終了します。