如何正确使用继承并避免向下转换

时间:2015-07-21 01:41:51

标签: java oop

让我们建立一个假设的场景。我有父类

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:这是我遇到的设计糟糕的遗留代码所产生的情况,我只是想找出更快但更干净的修复方法。

4 个答案:

答案 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编程的等同于“在这里,拿着我的啤酒看这个。”