[英]Is type casting to super class and calling an overriden method acceptable? (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();}
这是一个“好的”编程,如果不是,那么什么是紧凑的替代方案? (如果可能,请使用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语句,因为它会使代码更大,更复杂。
是否被认为是完全可以接受的。 真正的问题是它没有按照您认为的那样做。 它不会“调用重写的方法”。 派生类的方法仍被调用。 如果要调用重写的方法,则必须在派生类中使用super关键字。
您可能要使用泛型:
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
看起来可行,但是它被认为是“好的”编程吗?
用您的问题的措辞来模量问题...
是的,在超类中声明一个方法,在子类中重写它,然后进行多态调用是一种很好的编程方法。
它肯定比使用测试instanceof
链或类名称的switch
好得多。 这些方法被认为是“不好的”……因为它们涉及将过多的类层次结构知识连接到其他代码中。 例如,如果添加Foo
另一个子类,则所有这些开关都需要检查并可能更改。 (而且编译器不会提醒您这样做...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.