我有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()
这样的方法,因为它是一个基类对象。
我需要建议 -
是否可以使用基类对象调用派生类对象方法? 或者我是否需要以其他好方式重新设计此场景?
答案 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相同的函数。