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

仅当 Bx.methodX() 对不同的 Ax 执行相同的操作时,使用这种 imo 的继承才有意义。在这种情况下,您应该这样命名它们:

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();
  }

然后你只需要 A 调用 doWhatAMeans() 并且 A1 和 A2 只需要注入 Bx 的适当实例。

另一方面,如果 doWhatAMeans 没有意义,因为 methodX 做了不同的事情,对 Ax 意味着不同的事情,那么你需要重新考虑你的对象模型,可能并行结构 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 回答