【发布时间】:2015-07-21 01:41:50
【问题描述】:
让我们建立一个假设场景。我有父类
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:这是由我遇到的设计不佳的遗留代码产生的情况,我只是想找出更快但更干净的方法来修复作为练习。
【问题讨论】:
-
如果参数
A是instanceof B,将使用B的doSomething()方法,因为它是OverridingA的doSomething()方法。无需将A转换为B即可使其正常工作。 -
“我从来没有收到 B 的实例,因为 someClass 从必须始终使用 A 实例的接口覆盖了这个方法。”你怎么能确定你永远不会收到 B 的实例(因为 B is-a A)?我信任的唯一约束是
someInterface中描述的约束。 -
你有可能重构 A 和/或 B 吗?