它似乎有效,但它是否为“好”编程?
这是一个澄清的例子:
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();}
这是一个很好的'好'编程,如果不是什么是一个很好的紧凑替代品? (除了switch(o.getClass()),如果可能的话)
编辑,因为我很难澄清它似乎:)
我的意思是调用已被覆盖的方法而不是super方法。 我想做的另一种方法是:
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语句,因为它会使代码更大更复杂。
答案 0 :(得分:2)
它是否被认为是可接受的完全不是重点。真正的问题是它没有做你认为它做的事情。它不会“调用重写方法”。派生类的方法仍然被调用。如果要调用重写方法,则必须在派生类中使用super关键字。
答案 1 :(得分: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
答案 2 :(得分:1)
它似乎有效,但它是否为“好”编程?
使用问题的措辞模拟问题...
是的,在超类中声明一个方法,在子类中覆盖它,并以多态方式调用它是一个很好的编程。
肯定比在类名上使用instanceof
测试链或switch
要好得多。这些方法被认为是“糟糕的”......因为它们涉及将类层次结构的过多知识连接到其他代码中。例如,如果添加另一个Foo
的子类,则需要检查并可能更改所有这些开关。 (编译器不会提醒你这样做......)