基于运行时对象类型执行方法/代码



我有这种情况:

我有一个抽象的类,例如A,已经实现了多次。在应用程序的另一部分中,我有一个对象的列表,并且我需要根据列表中对象的实际类型进行几个操作。作为一个例子

/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
abstract class A{
    abstract void op();
}
class B extends A{
    void op(){
        System.out.println("b");
    }
    void opB(){
        System.out.println("it's b again!");
    }
}
class C extends A{
    void op(){
        System.out.println("c");
    }
    void opC(){
        System.out.println("it's b again!");
    }
}
class Ideone
{
    public static void doStuff(B b){
        b.opB();
        //Some operation unique to class B
    }
    public static void doStuff(C c){
        //some operation unique to class C
        c.opC();
    }
    public static void main (String[] args) throws java.lang.Exception
    {
        List<A> l = someMethodThatGivesMeTheList();
        for(A a: l){
            //Here it should use the right
            doStuff(a);
        }
    }
}

该示例没有编译,而是解释了我想做什么。如何?

我只发现使用访客模式的可能性,但这需要修改A类及其子类以接受访客,我更喜欢避免。

使用 getClass()和switch if笨拙,而不是我要寻找的东西。

在示例中,我使用了两种静态方法,但是一些新类,包装器,只要解决问题,我就可以使用一切,我可以完全控制代码。

这里的一个类似问题是基于运行时类型INSEAD类型的调用方法,但是就我而言,我正在使用Java,因此没有dynamic类型可以解决我的问题。

编辑:我在这里写的是在评论中写的,只是为了使其更清楚。该操作不能成为A的方法,因为它代表了必须分开的事物,例如基于实际数据类型的GUI创建。可以作为包装器作为包装器,但仍然需要根据实际对象创建正确的GUI对象,这会使我回到同一问题,或者至少在我看来。

编辑2(返回(:我已经更改了一个示例,以更好地证明我需要根据实际的类做事。这与我的情况相距甚远,但问题是相同的,一个集合删除了真实的对象类,我需要一种更聪明地恢复 instanceofgetClass()

的方法。

您是否检查了命令设计模式

  interface A{
    void op();
}
    class C implements A {
    public void op() {
        System.out.println("class c command method");
    }
}
class B implements A {
    public void op() {
        System.out.println("class B command method op");
    }
}
class D implements A {
    public void op() {
        System.out.println("class D method op");
    }
}
public class CommandDemo {
    public static List produceRequests() {
        List<A> list = new ArrayList<>();
        queue.add(new B());
        queue.add(new C());
        queue.add(new D());
        return list;
    }

    public static void main( String[] args ) {
        List list= produceRequests();
        for (Object command : list) {
            ((A)command).execute();
        }
    }
}

输出

class B command method op
class C command method 
class D method op

最新更新