Vector存储对象的一个问题

一个Vector v 中存储了A a、 B b、C c三个对象,A,B,C 三个类实现了一个共同的接口show(),但各自的实际工作有很大差别。
现在要访问a,b,c三个对象的show()方法,该如何访问?

问题:
一个对象存入到Vector中时,转换成了一个Object对象,从Vector中取出时也是一个Object,需要先转换成原来的类的类型,才能调用该类的方法,a,b,c存入到Vector中后(程序)就不知道它属于那个类,也就不知道该怎么转换。

该如何解决这个问题,原来考虑使用reflect来解决,但是不行。

如果A,B,C三个类都是集成的同一个超类,超类又实现的同一个接口就没问题。
但A,B,C单个类的差别太大了,不可能使用同一个超类。

弄一个接口不行吗?
A/B/C都IMPLEMENTS这个接口就是了,中间我看不必走这个超类了吧

接口解决不料这个问题。
问题具体在这里:
Vector v = new Vector();
v.add(new A());
v.add(new B());
v.add(new C());
Enumeration e = v.elements();
while(e.hasMoreElements()){
//问题在这里,Type在程序中没办法决定是什么
Type tmp = (Type) e.nextElement();
//A,B,C所实现的接口show()
tmp.show();
}

接口,是不行的。共同的超类可以,例如三个类的超类都是D,那么Type是D就行了,根据多态的理论,tmp会自动调用合适的show()。
但,a,b,c的功能差别太大了,除了show()方法的功能有相似之处。所有肯定不能让他们继承同一个超类。

quote: 该如何解决这个问题,原来考虑使用reflect来解决,但是不行。

为什么不能使用reflect?


while(e.hasMoreElements()){
//use reflect
Object tmp = e.nextElement();
Method show = tmp.getClass().getMethod(
"show");
//assume parameters is null;
show.invoke(null, null);
}

reflect是可以。
一开始犯晕了。以为得到的是一个object,列举出来的方法都是object的那些方法。

楼上的兄弟的思路是行的,但Menthod类使用的不对。不过还是谢了先。

接口不行,怎么会?
public class First {

public static void main(String[] args) {

java.util.Vector v = new java.util.Vector();
v.add(new A());
v.add(new B());
v.add(new C());

for (int i=0; i<v.size(); i++) {
((InFace) v.get(i)).show();
}
}
}

interface InFace {
public void show();
}

class A implements InFace {
public void show() {
System.out.println("A class");
}
}

class B implements InFace {
public void show() {
System.out.println("B class");
}
}

class C implements InFace {
public void show() {
System.out.println("C class");
}
}

结果:(ant执行)
Buildfile: build.xml

run:
[java] A class
[java] B class
[java] C class

BUILD SUCCESSFUL
Total time: 1 second

一个比较笨的方法,但肯定是可以行得通的。

for(i=0;i<v.size();i++)
{
Object obj=v.get(i);
if(obj instanceof A)
{
((A)obj).show();
}
if(obj instanceof B)
{
((B)obj).show();
}
if(obj instanceof C)
{
((C)obj).show();
}
}


一个Vector v 中存储了A a、 B b、C c三个对象,A,B,C 三个类实现了一个共同的接口show(),但各自的实际工作有很大差别。
现在要访问a,b,c三个对象的show()方法,该如何访问?

reflect还是最灵活的解决方案,只要各个类中有同名的方法就是了。
程序写了N多了,不可能再回头给所有的包含show方法的类定义一个接口。

reflect 加 visitor模式

在object pascal中通过"is"来判断某一实例对象属于哪一对象类。通过
强制转换来实现操作。X是某一数组列表属于TX1、TX2、TX3的一元素。通过枚举方法实现X操作如:
if X is TX1 then
TX1(X).Show
else if X is TX2 then
TX2(X).Show
else if X is TX3 then
TX3(X).Show;
目前正在学Java对Java还不很熟悉,不知道java有没有类似“Is"(属于对象判断方法)和对象强制转换方法。

for (int i = 0; i < size; i++ )
{
allob aR =(allob)_receivers.elementAt( i );
aR.show();
}
其中receivers表示Vector对象,allob是了A a、 B b、C c实现的接口.

对啊,用接口是可以实现的,jbwang的代码难道不能解决这个问题吗?