使用基类对象调用派生类方法

时间:2013-03-08 17:18:26

标签: java

我有6个班级,如下图所示。 现在,class A将类B的对象定义为私有变量。类A方法也会调用B类中的许多方法,例如B.method1()。 现在,类A_Base1是从类A派生的,需要从派生类B_Base1调用方法;例如B1.method2()。并且类A_Base2的方法也需要调用类B_Base2中的方法;例如B2.method3()

现在在A类中,我将变量定义为 -

private B bObject

现在在A_Base1的方法中,我无法调用像bObject.method2()这样的方法,因为它是一个基类对象。

我需要建议 -

是否可以使用基类对象调用派生类对象方法? 或者我是否需要以其他好方式重新设计此场景?

figure

3 个答案:

答案 0 :(得分: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;
   }
}

然后你可以使用

答案 1 :(得分: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();
  }

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

另一方面,如果doWhatAMeans没有意义,因为methodX做了与Ax不同的不同事情,那么你需要重新思考你的对象模型,可能是并行结构A,A1,A2和B,B1, B2错了。

答案 2 :(得分:0)

因为A是A_Base1的父级(我假设已经扩展),你可以进行访问B公共(或受保护)的函数调用,然后A_Base1或A_Base2可以使用与调用B相同的函数。