我有这种情况:
我有一个抽象的类,例如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(返回(:我已经更改了一个示例,以更好地证明我需要根据实际的类做事。这与我的情况相距甚远,但问题是相同的,一个集合删除了真实的对象类,我需要一种更聪明地恢复 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();
}
}
}
输出
class B command method op
class C command method
class D method op