2013-06-20 81 views
0

我有一个抽象超类叫C和它的多个子类:SubC1, SubC2, ...现在我有一个超类C的集合,我想遍历它,但做一些不同的取决于它是哪个子类。这里是伪代码:确定正确downcast的最佳方法

abstract class C{} 
class SubC1 extends C{} 
class SubC2 extends C{} 

... 

for(C c : cs){ 
    if(c is a SubC1){ 
    //do one thing 
    } 
    if(c is a SubC2){ 
    //do another 
    } 
} 

但是我不知道如何设置if条件。我的第一个想法是使用instanceof,但后来我意识到它不适用于downcasts。然后我考虑添加一个String字段到C,并让每个子类定义它并基于我的条件,但看起来很笨重。我还考虑过试图通过强制沮丧和赶上ClassCastExceptions来消除过程,但这也很笨重,似乎有点危险。那么,如何在没有愚蠢的代码的情况下得到我想要的?

编辑:我忘了补充说,在C中添加一个doSomething()函数并忽略它是没有意义的。

编辑2:出于某种原因,我认为做c instanceof SubC1导致编译器错误。现在我意识到它没有我的答案。

+2

这就是多态性是。在基类中定义一个抽象方法,然后将特定行为置于每个子类的覆盖中。 –

+0

看看这个:http://www.artima.com/interfacedesign/PreferPoly.html – Rob013

+0

@OliCharlesworth我编辑了我的问题以回应您的评论。 –

回答

3

有在C抽象方法doSomething和所有子类覆盖它,然后调用

+0

我忘了补充,我真的不能这样做。这没有多大意义。 –

+1

在这种情况下,你坚持'if(c instanceof SubC1){SubC1 subc1 =(SubC1)c; }' –

+0

哦...由于某种原因,我认为这导致了一个编译器错误。没关系。 –