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

Java 动态地将不同的对象传递给同一个方法,java,parameter-passing,overriding,Java,Parameter Passing,Overriding,我有一个方法,当作为参数传递时,它对4种不同的类执行相同的任务。目前,我必须为所有4个类编写4次该方法。例如: doSomethingForClass1(MyClass1 myclass1, Address address); doSomethingForClass2(MyClass2 myclass2, Address address); doSomethingForClass3(MyClass3 myclass3, Address address); doSomethingForClass4

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

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

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

一个可能的解决方案是让您的MyClassX类都从同一个超类或接口扩展,然后创建一个使用超类或接口参数的方法——换句话说,使用超类型

并让您的类共享一个接口

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

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


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

如果它们执行相同的操作,为什么它们接受完全不同的对象?如果“做同样的事情”的意思是“调用完全相同的方法”,那么所有
MyClass?
类型都应该有一个公共接口/超类,收集所有公共方法:

public MyClass1 implements MyClass {/*...*/}
public MyClass2 implements MyClass {/*...*/}
public MyClass3 implements MyClass {/*...*/}
public MyClass4 implements MyClass {/*...*/}
现在利用多态性:

doSomethingForClass(MyClass myclass, Address address);

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

doSomethingForClass1(IMyClass myclass, Address address);
尽管这可能不可能,也可能对您的应用程序没有意义。但是,如果这是有意义的,也考虑把方法放在界面中。e、 g

   public interface IMyClass {
       public void doSomethingWithAnAddress(Address address);
   }
然后你的代码变得更简单

myClass.doSomethingWithAnAddress(address);

p、 您还可以使用一个公共抽象基类而不是接口。

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

doSomething( Interface myClass, Address address);

编辑:正如您在评论中所注意到的,我们强烈反对我的代码示例中使用的实践,尤其是作为初学者。不过,它仍在这里供您参考

我认为你想探索遗传和多态性。或者,我猜一个丑陋的解决方案是将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();
}

这至少可以解决合并部分的问题。不过,遗传和多态性会更加性感

如果不知道这些类是如何关联的,以及您在方法中对它们做了什么,很难说。但是多态性和/或泛型都应该对你有所帮助。既然这个答案的第一部分跟在所有其他答案后面,为什么要投反对票?第二部分是从“@ MasterCassim”中查找信息专家主体的建议,只是为了检查我的理智,我只是看了JavaUTL.Cub,而没有一个方法被公开或抽象。你是说我应该在方法声明中省略“public”,这实际上很重要吗???这里你不需要public:public void dosomethingwithanaaddress(Address);默认情况下,as接口方法是公共抽象的。见@mastercasim,明白了。主要是出于习惯(因为同事们也这么做),我总是把多余的“公众”放进去。我认为,当你在深夜开始忘记代码是否在类或接口中时,有时会有所帮助。(或者有很多内部类/内部接口)。请不要建议使用instanceOf anti-pattern。这就是我们使用OOPs来避免的。这很苛刻-这不是一个建议,因此我强调继承和多态性。我只是提出建议,如果有人觉得有用的话。这不是建议?你可以给出一个代码示例,一个应该删除的示例,因为它甚至不应该是一个建议。完全错了,错了?我认为这应由实现者和编译器来决定。@c24w:根据我们的建议。由于他们通常是新手,他们无法区分好的建议和坏的建议,否则他们就不会首先提出问题,这就是为什么我们不应该给出坏的建议。再说一次,你的建议很糟糕。
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();
}