类型转换为超类并调用重写方法是否可接受? (JAVA)

时间:2012-12-16 00:18:20

标签: java types casting override super

它似乎有效,但它是否为“好”编程?

这是一个澄清的例子:

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语句,因为它会使代码更大更复杂。

3 个答案:

答案 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的子类,则需要检查并可能更改所有这些开关。 (编译器不会提醒你这样做......)