Java 使用基类对象调用派生类方法
我有6个类,如下图所示。 现在,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()这样的方法,因为它是一个基类
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()这样的方法,因为它是一个基类对象
我需要关于以下方面的建议:
是否可以使用基类对象调用派生类对象方法?
或者我需要用其他好的方式重新设计这个场景吗
你可以随时施展。假设您的类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);}等开始。一般来说,只要调用方层次结构知道有关被调用方层次结构的任何信息,就会发出一种气味,反之亦然。