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

Java 基于运行时对象类型执行方法/代码,java,inheritance,design-patterns,Java,Inheritance,Design Patterns,我有这样的情况: 我有一个抽象类,比方说一个抽象类,实现了好几次。 在应用程序的另一部分中,我有一个对象列表,我有几个操作需要根据列表中对象的实际类型执行。 例如 /* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import java.io.*; abstract class A{ abstract void op(); } class B ex

我有这样的情况:

我有一个抽象类,比方说一个抽象类,实现了好几次。 在应用程序的另一部分中,我有一个对象列表,我有几个操作需要根据列表中对象的实际类型执行。 例如

/* 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);
        }
    }
}
/*打包任何内容;//不要放置包名*/
导入java.util.*;
导入java.lang.*;
导入java.io.*;
抽象A类{
抽象void op();
}
B类扩展了A类{
void op(){
系统输出打印项次(“b”);
}
void opB(){
System.out.println(“又是b!”);
}
}
C类扩展了{
void op(){
系统输出打印项次(“c”);
}
void opC(){
System.out.println(“又是b!”);
}
}
表意文字
{
公共静态空隙度(B){
b、 opB();
//B类特有的一些操作
}
公共静态空隙度(C){
//C类特有的一些操作
c、 opC();
}
公共静态void main(字符串[]args)引发java.lang.Exception
{
列表,但在我的例子中,我使用的是Java,因此不存在解决我的问题的
dynamic
类型

编辑:我在这里写我在评论中写的只是为了让它更清楚。操作不能成为一个方法,因为它代表了必须分开的东西,比如基于实际数据类型的GUI创建。并行层次结构可以作为包装器,但仍然需要基于实际数据类型创建正确的GUI对象bject把我带回到同样的问题上,至少在我看来是这样


编辑2(返回):我对示例做了一点修改,以更好地显示我需要根据实际的类进行操作。这与我的情况有些不同,但问题是相同的,集合会擦除真实的对象类,我需要一种更智能的恢复方法,即
instanceof
getClass()

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

  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();
        }
    }
}

//类C特有的一些操作
移动到
C#op
并使用动态分派。在我的情况下,这将违反视图和模型之间的分离,因为
//类C特有的一些操作
是,在这种情况下,创建GUI元素对数据进行操作,而B和C是共享sa的不同类型的数据me接口(A)。谢谢你的回答,不幸的是,这不是我想要的。我想根据对象类型做不同的事情,但不在这些类中写任何东西。也许我没有清楚地公开它,我会编辑这个问题。
class B command method op
class C command method 
class D method op