Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用基类对象调用派生类方法_Java - Fatal编程技术网

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

Java 使用基类对象调用派生类方法,java,Java,我有6个类,如下图所示。 现在,class A将classB的对象定义为私有变量。另外,类A方法调用类B中的许多方法,例如B.method1()。 现在,类A_Base1是从类A派生的,需要从派生类B_Base1调用方法;例如B1.method2()。类A_Base2的方法也需要调用类B_Base2中的方法;例如B2.method3() 现在在类A中,我将变量定义为- private B对象 现在在A_Base1的方法中,我不能调用像bObject.method2()这样的方法,因为它是一个基类

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

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

private B对象

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

我需要关于以下方面的建议:

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


你可以随时施展。假设您的类A提供了此方法:

protected B getBInstance() {
   return bObject;
}
然后,在基础1中,您可以执行以下操作:

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

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

像这样使用继承只有在Bx.methodX()的情况下才有意义做些对不同的斧头意味着她是一样的事情。在这种情况下,你应该这样命名:

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是错误的。

如果两棵树同时生长,你可能会闻到一种叫做并行继承层次结构的臭味。
不,我不能在
a_Base1
中执行
super.bObject.method2()。我没有正确地看到你的形象。@iberbeu我想你是对的。。。我可能必须重新设计这些东西。但是
A_Base1
需要在
B_Base1
中调用方法,而
A_Base2
需要在
B_Base2
中调用方法,因此A_Base2需要在其构造函数中以微笑的方式获取B_Base2的实例。为什么有这样的定义没有任何意义??考虑到我的方法<代码>()和/>代码,它根据不同的实现来绘制对象。在这种情况下,您将有一个接口或抽象类声明DRAW(),并使实现实现它。您不想要的是一个Screen类和一个Paper类,它们有自己的draw(Object o)实现,所有这些实现都以if(o instanceof Circle){drawCircle(o);}或者if(o instanceof Square){drawSquare(o);}等开始。一般来说,只要调用方层次结构知道有关被调用方层次结构的任何信息,就会发出一种气味,反之亦然。