2012-12-16 19 views
2

它似乎工作,但它是一个'好'的编程?将类型转换为超类并调用override方法可接受? (Java)

下面是一个例子来阐明:

public class foo{ 
    foomethod(){do something}; 
} 

public class foo1 extends foo{ 
    @override foomethod(){do something}; 
} 

public class foo2 extends foo{ 
    @override foomethod(){do something}; 
} 

ArrayList x /*with foo1 and foo2 objects*/ 
for (Object o : x){((foo)o).foomethod();} 

是这个concidered“好”节目,如果没有什么是一个不错的紧凑的替代? (除了开关(o.getClass()),如果可能的话)

编辑,因为我真的很糟糕的澄清似乎:)

我的意思是调用已重写方法,而不是超方法。 什么我想要做的是另一种方法:

ArrayList中的x/*再次foo1和foo2的对象*/

for (Object o : x){ 
    switch(o.getClass()){ 
     case foo1.class: 
      ((foo1)o).foomethod(); 
      break; 
     case foo2.class: 
      ((foo1)o).foomethod(); 
      break; 
    } 
} 

,但我想避免switch语句,因为它使代码更更大更复杂。

+3

好吧,如果你的软件设计的很好,你应该永远不需要那样做。覆盖该方法的重点是因为如果一个对象是超类的子类,它应该具有不同的功能。 – Joel

+0

*“我的意思是调用已被覆盖的方法,而不是超级方法。”* - 这没有意义。超类中的方法是重写的方法! –

+0

我知道,有些事情很难用第一种语言进行沟通,对不起,我的意思是调用重写超级方法的方法,这样做会让人感觉如何? – r0t0r

回答

1

看来工作,但它concidered '好' 的编程?

模与你的问题的措辞问题...

是的,这是良好的编程超类声明的方法,在子类中重写它,polymorphicly调用它。

它肯定比在类名上使用instanceof测试链或switch好得多。这些方法被认为是“不好的”......因为它们涉及将太多的类层次结构知识引入其他代码。例如,如果您添加Foo的另一个子类别,则需要检查所有这些开关并可能进行更改。 (编译器不会提醒你这样做......)

+0

谢谢,并再次所有抱歉,如果我的问题(这正是这一点)很难得到,因为英语不是我的第一语言。我必须将这个答案设定为已接受的答案,因为它完全符合要求,但感谢您的答案。 – r0t0r

2

不管它是否被认为是可以接受的,都完全在这一点上。真正的问题是,它不会做你认为它所做的事情。它不会'调用重写的方法'。派生类的方法仍然被调用。如果你想调用重写的方法,你必须在派生类中使用super关键字。

+0

哦,我的坏,我的意思是调用扩展类的方法,而不是超类的方法。 – r0t0r

+0

在这种情况下,您所做的只是两种选择之一,另一种是使用泛型,因此您的问题再次徒劳无益。 – EJP

2

你可能想使用泛型:

public class Foo{ 
    public void fooMethod(){ System.out.println("Foo");}; 
} 

public class Foo1 extends Foo{ 
    @Override public void fooMethod(){System.out.println("1");}; 
} 

public class Foo2 extends Foo{ 
    @Override public void fooMethod(){System.out.println("2");}; 
} 

... 

List<Foo> x = new ArrayList<Foo>(); 
x.add(new Foo1()); 
x.add(new Foo2()); 
x.add(new Foo()); 

for (Foo o : x){ o.fooMethod();} 

输出将是:

1 
2 
Foo 
+0

+1。如果你正确地做到这一点,根本不需要铸造。 –

+0

这实际上正是我在我的代码实际上做的,所以我想没有问题/反对与实际类型化Foo1和Foo2 Foo并调用重写方法。如果我没有遗漏什么,那么谢谢你应该是这样的:) – r0t0r

相关问题