5

下の図に示すように、6つのクラスがあります。これで、プライベート変数としてclass AクラスのオブジェクトがB定義されました。また、クラスAメソッドは、たとえば、クラスBから多くのメソッドを呼び出しますB.method1()。ここで、クラスA_Base1はクラスから派生Aしたものであり、派生クラスからメソッドを呼び出す必要がありますB_Base1。たとえばB1.method2()。また、クラスのメソッドはクラスA_Base2からメソッドを呼び出す必要がありB_Base2ます。たとえばB2.method3()

今クラスAIで変数を-として定義します

private B bObject

のメソッドでは、基本クラスのオブジェクトであるため、のA_Base1ようなメソッドを呼び出すことはできません。bObject.method2()

提案が必要です-

基本クラスオブジェクトを使用して派生クラスオブジェクトメソッドを呼び出すことは可能ですか?または、このシナリオを他の良い方法で再設計する必要がありますか?

形

4

3 に答える 3

3

あなたはいつでもキャストすることができます。クラスAがこのメソッドを提供するとします。

protected B getBInstance() {
   return bObject;
}

次に、A_Base1で次のようなことを行うことができます。

((B_Base1)getBInstance()).method2();

ただし、これは非常に悪い設計です。A_Base1クラスにB_Base1のインスタンスが必要な場合は、構築時にそのようなインスタンスを直接渡す必要があります。

public class A_Base1 extends A {
   private B_Base1 b1Object;
   public A_Base1(B_Base1 instance) {
      super(B_Base1); //works as a B for parent
      this.b1Ovject = instance;
   }
}

そして、あなたはそれを使うことができます

于 2013-03-08T17:22:53.827 に答える
3

このimoのような継承を使用することは、Bx.methodX()が別のAxに対して同じことを意味する何かを行う場合にのみ意味があります。その場合は、次のように名前を付ける必要があります。

public class B {
  public void doWhatAMeans() {
    method1();
  }

public class B1 extends B {
  @Override
  public void doWhatAMeans() {
    method2();
  }

public class B2 extends B {
  @Override
  public void doWhatAMeans() {
    method3();
  }

次に、doWhatAMeans()を呼び出すためにAが必要なだけで、A1とA2にBxの適切なインスタンスを注入するだけで済みます。

一方、methodXがAxに対して異なることを意味する異なることを行うため、doWhatAMeansが意味をなさない場合は、オブジェクトモデルを再考する必要があります。おそらく、並列構造A、A1、A2とB、B1、B2は間違っています。それから。

于 2013-03-08T17:28:57.990 に答える
0

AはA_Base1の親であるため(拡張されていると想定しています)、Bにアクセスする関数呼び出しをパブリック(または保護)にすることができ、A_Base1またはA_Base2はAがBを呼び出すのと同じ関数を使用できます。

于 2013-03-08T17:24:56.480 に答える