动态地将不同对象传递给同一方法

时间:2012-01-22 17:23:30

标签: java parameter-passing method-overriding

我有一个方法,当作为参数传递时,对4种不同类的类执行相同的任务。目前,我必须为所有4个类编写该方法4次。例如:

doSomethingForClass1(MyClass1 myclass1, Address address);
doSomethingForClass2(MyClass2 myclass2, Address address);
doSomethingForClass3(MyClass3 myclass3, Address address);
doSomethingForClass4(MyClass4 myclass4, Address address);

所有这些方法都做同样的事情并返回相同的对象。如何将其合并为一个方法并传递不同的对象?

5 个答案:

答案 0 :(得分:5)

如果你的所有4个类都可以实现相同的接口,比如IMyClass,那么你可以使用一个方法。

doSomethingForClass1(IMyClass myclass, Address address);

虽然这可能无法实现,也可能对您的申请没有意义。但是,如果这确实有意义,也可以考虑将该方法放在界面中。 e.g。

   public interface IMyClass {
       public void doSomethingWithAnAddress(Address address);
   }

然后你的代码变得更加简单,

myClass.doSomethingWithAnAddress(address);

P.S。你也可以有一个共同的抽象基类而不是接口。

答案 1 :(得分:1)

一个可能的解决方案是让你的MyClassX类从同一个超类或接口扩展,然后创建一个使用超类或接口参数的方法 - 换句话说就是有一个超级类型< / em>的

doSomethingForClass(MySuperType superType, Address address) {
    // ...
}

让你的班级共享一个界面

class MyClass1 implements MySuperType {
    //....
}

和,...

class MyClass2 implements MySuperType {
    //....
}

等...

为此,doSomethingForClass(...)方法只能调用接口中定义的方法。

答案 2 :(得分:1)

如果他们做同样的事情,他们怎么接受完全不同的对象?如果“做同样的事情”你的意思是“调用完全相同的方法”,看起来所有的MyClass?类型应该有一个共同的接口/超类,收集所有常用方法:

public MyClass1 implements MyClass {/*...*/}
public MyClass2 implements MyClass {/*...*/}
public MyClass3 implements MyClass {/*...*/}
public MyClass4 implements MyClass {/*...*/}

现在利用多态性:

doSomethingForClass(MyClass myclass, Address address);

答案 3 :(得分:1)

编辑:正如您将从评论中注意到的那样,我们强烈劝阻我的代码示例中使用的做法,特别是作为初学者。不过,它仍然在这里供您参考。

我认为你想要探索继承和多态。或者,我想一个丑陋的解决方案是将你的MyClass参数“提升”为Object,然后是:

myMethod(Object myClass, Address address){
    if(myClass instanceof MyClass1){
        MyClass1 mc = (MyClass1) myClass;
        doStuff();
    }
    else if(myClass instanceof MyClass2){
        MyClass2 mc = (MyClass2) myClass;
        doStuff();
    }
    else if(myClass instanceof MyClass3){
        MyClass3 mc = (MyClass3) myClass;
        doStuff();
    }
    else if(myClass instanceof MyClass4){
        MyClass4 mc = (MyClass4) myClass;
        doStuff();
    }
    else panic();
}

这至少可以解决整合部分。遗传和多态性会更加性感。

答案 4 :(得分:0)

如果你需要对这4个类执行相同的操作,使用完全相同的方法调用,......这些类可能实现相同的接口或从同一个超类扩展。在这种情况下,您可以针对该接口/抽象类进行编程

doSomething( Interface myClass, Address address);