让我们建立一个假设的场景。我有父类
public class A {
protected void doSomething(){
//do something the A way
}
}
和儿童班
public class B extends A{
@Override
protected void doSomething(){
// do something the B way
}
}
我有一些假设的课程:
public class SomeClass implements someInterface{
@Override
public void someMethod(A aObject){
aObject.doSomething();
}
}
但是我想使用B的行为,我不能改变方法参数,也不能将它转发给B。
显然我正在处理一个更大的问题,但这是相同的原则,我对自己的答案是将A的属性克隆到B中,然后使用B.但在此之前我想听到更多的意见。
编辑:约束,我不能将B的实例传递给方法,也不能使用instanceof方法。
编辑2:我从未收到过B的实例,因为someClass会从必须始终使用A实例的接口覆盖此方法。
编辑3:这是我遇到的设计糟糕的遗留代码所产生的情况,我只是想找出更快但更干净的修复方法。
答案 0 :(得分:3)
从B
“ISA”someMethod()
开始,只需将B
的实例传递给A
,它就能正常运行,并会调用B
的{{1} }}
答案 1 :(得分:2)
简单的答案是,这是不可能的。
当您创建superclass
的对象时,它没有subclass
的方法。因此,根本无法在subclass
对象上调用superclass
方法。
答案 2 :(得分:1)
要使用B类的方法,您传入的对象必须是B类的实例。然后,当您执行aObject.doSomething()时,将自动调用B类中的方法,因为在运行时A对象将被识别为B对象,它实际上覆盖了doSomething()方法。
答案 3 :(得分:1)
另一个答案是,这完全是考虑继承的正确方法以及不同类调用的方法。
对于B延伸A,B需要是A的特例。我们可以在passengerAuto / vehicle,或circle / shape等之间建立这样的关系。
您似乎正在尝试在类中创建方法,然后围绕该方法创建继承关系,以便您可以在两个位置使用该方法。但是有很多地方可以放置可以从多个地方调用的方法,这是一个非常糟糕的方法。
不要这样做。不要设计你的类,这样你就可以进行'漂亮'的方法调用。这是OO编程的等同于“在这里,拿着我的啤酒看这个。”