Javaで問題が発生しています。私は拡張できる方法があります。問題は、このメソッドがクラスの他のメソッドを呼び出すことで、これらも拡張できます。私は、次の手順を実行するとJavaで特定のクラスメソッドを呼び出す(ポリモーフィズムなし)
public class Abc extends Foo {
}
:このクラスでも
public class Bar extends Foo {
protected int xAverage = 0;
protected int xCount = 0;
protected int y;
public updateMe(int x, int y) {
super.updateMe(x, y);
updateX(x);
updateY(x);
}
protected updateX(int x) {
this.xAverage = (this.xAverage * this.xCount) + x;
this.xCount++;
this.xAverage /= xCount;
}
protected updateY(int y) {
this.y = y;
}
}
そして:このクラスは以下のクラスによって拡張され
public class Foo {
protected int xLast;
public updateMe(int x, int y) {
updateX(x);
}
protected updateX(int x) {
this.xLast = x;
}
}
:
は、次のクラスを考えてみましょう:Foo myBar = new Bar();
myBar.updateMe(1, 2);
Foo.updateX
メソッドは呼び出されませんが、Bar.updateX
メソッドは2回呼び出されます。いくつかのソリューションは、いくつかは、うまく動作したり、非常に醜いはありません、ありますBar.updateX
コールsuper.updateX
で
- 。これにより、両方の
updateX
メソッドが2回呼び出されます。 Foo.updateMe
のupdateX
コールを削除して、拡張クラスがsuper.updateX
を呼び出すようにします。これにより、クラスAbc
に不要なコードが必要になります。そうしないと、AbcクラスはupdateX
を呼び出しません。- メソッドが互いにオーバーライドしないようにメソッドの名前を変更します。これは機能しますが、安全ではありません(将来、これは忘れられて問題につながるかもしれません)。また、言語によって強制されません。
これは多少コード臭のことですが、これを行う方法はわかりません。
基本的に私はこのようなことをしています:Foo.updateMe
Foo.updateX
と具体的にはupdateX
に電話したいと思います。
C#でnew
メソッドキーワードのようなものが私の問題を解決できるとは思っていますが、Javaではこれを実現する方法がないようです。
編集:私はちょうど問題のあるメソッドの名前を変更することを選んだ最後に
。私はこの問題を引き起こすただ一つの方法を持っています、そして、解決策はここで示唆されました、しかし、デザインの観点からの音はこの特定のコードを理解し、維持するのをより困難にします。
IOC(Inversion of control)を使用することはできますが、私は本当に理解できません。http://en.wikipedia.org/wiki/Inversion_of_control –
この質問とIOCとの関係は何ですか?IOCは私たちの永遠の問題を終わらせるための銀の弾丸ではありません。 –