2015-07-21 51 views
1

让我们设置一个假设的方案。我父类如何正确使用继承并避免向下滚动

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.

很明显,我处理了一个更大的问题,但这是t他同样的原则,我自己的答案是将A的属性克隆到B中,然后使用B.但在此之前,我想听到更多的意见。

编辑:约束,我不能将B的实例传递给方法,也不使用instanceof方法。

编辑2:因为SomeClass的覆盖从接口这个方法必须始终使用A.

的实例

编辑3我从来没有收到B的一个实例:这是由设计不当遗留代码,我跑生成的情况进入,我只是想找出更快,但干净的方式来解决作为excercise。

+2

如果参数'A'是一个''instanceofB'','B'的'doSomething()'方法将被使用,因为它是'Overriding'''的'doSomething()'方法。没有必要将'A'转换为'B'来实现这个功能。 – CoderMusgrove

+0

[调用Java中的子类的方法]可能的重复(http://stackoverflow.com/questions/2701182/call-a-method-of-subclass-in-java) –

+0

“我永远不会收到B的实例,因为someClass从必须始终使用A的实例的接口覆盖此方法。“你怎么能确定你永远不会收到一个B的实例(因为B是-A)?我信任的唯一约束是'someInterface'中描述的约束。 – Spotted

回答

3

B实例只是传递到someMethod()因为B“ISA” A,它会工作,会调用BdoSomething()

+0

约束:我从来没有收到B的实例 –

+0

那么你的设计是错误的。如果你想在'A'(而不是子类'B')上调用''''doSomething()'',那么这个代码属于'A'(或者某个实用程序包)。 – John3136

+0

同意,好的是,代码不是我的准确,坏的是我必须处理它。谢谢约翰。 –

1

要使用类B的方法,您传入的对象必须是类B的实例。然后,在执行aObject.doSomething()时,将自动调用类B的方法,因为在运行时A对象将被标识为实际上覆盖了doSomething()方法的B对象。

+0

约束:如果你没有一个BI的实例,我从来没有收到B的实例 –

+0

@LuisDurazo不明白如何从对象的B类调用一个方法,除非方法是静态的,重新传递它作为参数。 B是A,但A不是B.它不是双向的。所以,如果你收到一个A的实例,除非你能够投它,你不能把它当作B. – Zarwan

+0

这就是问题,是否真的没有办法?,我不能克隆A以适应B并且全部为null B的其他属性? –

2

简单的答案是,这是不可能的。

当您创建superclass的对象时,它不具有subclass的方法。因此,根本不可能在superclass对象上调用subclass方法。

1

另一个答案是,这是完全倒退到思考继承的正确方式,以及由不同类调用的方法。

对B延长A,B必须是A的特殊情况,我们可以有passengerAuto /车辆,或圆/形状之间的这种关系,等等

你似乎是试图建立一个方法,然后创建一个继承关系,以便您可以在两个地方使用该方法。但是有很多地方可以从多个地方调用方法,而且这个方法非常糟糕。

不要这样做。不要设计你的类,以便你可以进行'漂亮'的方法调用。这是面向对象的OO编程:“在这里,拿着我的啤酒,看着这个。”

+0

我同意这是设计不佳,我不得不重构大部分它(这是我没有写的遗留代码),谢谢阿西。 –