継承の単純な階層と単一のインターフェースがあります。クラスBによって拡張されるクラスAについて考えてみます。両方のクラスでインターフェイスIを実装し、クラスAを抽象化することを望みます。Javaでは、おおよそ次のようになります。
public interface I {
public double foobar();
public void print();
}
public abstract class A implements I {
@Override public double foobar() { /*return foo*/}
@Override public void print() {
System.out.print(foobar());
}
}
public class B extends A {
@Override public double foobar() { /*return bar*/ }
@Override public void print() {
super.print();
System.out.print(foobar);
}
}
私の意図は、タイプBのオブジェクトをインスタンス化してそのprint()を呼び出すときに、タイプBのオブジェクトに最初にクラスAのfooを出力させ、次にクラスBのbarを出力させることです。ただし、このコードを実行してコンパイルすると、どちらの場合もクラスBからfoobar()が呼び出されます。たとえば、fooが1に等しく、barが2に等しい場合、上記のコードの出力は次のようになります。
2 2
でも12にしたいです
さまざまな型キャストでメソッドを呼び出してみましたが、うまくいきませんでした。助言がありますか?
編集:多くの提案をありがとう、そして明確にするために、私はAの潜在的なサブクラスのそれぞれにIを実装してもらいたいと思います、そして私はそれを明示的に述べなかったことをお詫びします。さらに、私は現在、AのprintとAのfoobarの両方によって呼び出されるprivateFooBar()に追加のメソッドを追加することにより、動作するコードを持っています。ただし、このタスクを実行するためのより洗練された方法があるかどうかはまだ疑問です。