Динамическая передача разных объектов одному и тому же методу - PullRequest
0 голосов
/ 22 января 2012

У меня есть метод, который выполняет одну и ту же задачу для 4 различных классов при передаче в качестве параметров.В настоящее время я должен написать этот метод 4 раза для всех 4 из этих классов.Пример:

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

Все эти методы делают одно и то же и возвращают один и тот же объект.Как я могу объединить его в один метод и передать разные объекты?

Ответы [ 5 ]

5 голосов
/ 22 января 2012

Если бы все 4 ваших класса могли реализовывать один и тот же интерфейс, скажем, IMyClass, то у вас мог бы быть один метод.

doSomethingForClass1(IMyClass myclass, Address address);

Хотя это может быть невозможно или не иметь смысла для вашего приложения. Но, если это имеет смысл, также рассмотрите возможность размещения метода в интерфейсе. например,

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

И тогда ваш код станет еще проще,

myClass.doSomethingWithAnAddress(address);

p.s. у вас также может быть общий абстрактный базовый класс вместо интерфейса.

1 голос
/ 22 января 2012

Редактировать: как вы заметите из комментариев, мы решительно отрицаем практики, использованные в моем примере кода, особенно в качестве новичка.Однако он все еще здесь для справки.

Я думаю, что вы хотите исследовать наследование и полиморфизм.В качестве альтернативы, я полагаю, уродливым решением было бы «повысить» аргумент 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();
}

Это, по крайней мере, решило бы часть консолидации.Наследование и полиморфизм были бы намного сексуальнее.

1 голос
/ 22 января 2012

Если они делают одно и то же, почему они принимают полностью различных объектов?Если под " делать то же самое " вы имеете в виду ", вызывающий точно такие же методы ", похоже, что все типы MyClass? должны иметь общий интерфейс / суперкласс, собирая все общиеметоды:

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

Теперь, используя преимущества полиморфизма:

doSomethingForClass(MyClass myclass, Address address);
1 голос
/ 22 января 2012

Возможное решение состоит в том, чтобы все ваши классы MyClassX расширялись от одного и того же суперкласса или интерфейса, а затем создавали метод, который использует параметр суперкласса или интерфейса - другими словами, имеет супер тип .

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

и ваши классы имеют общий интерфейс

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

и ...

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

и т.д ...

Чтобы это работало, метод doSomethingForClass(...) может вызывать только те методы, которые определены в интерфейсе.

0 голосов
/ 22 января 2012

Если вам нужно выполнить одну и ту же операцию с этими 4 классами, с точно такими же вызовами методов, ... эти классы, вероятно, реализуют один и тот же интерфейс или расширяются из одного и того же суперкласса. В этом случае вы можете программировать на этот интерфейс / абстрактный класс

doSomething( Interface myClass, Address address);
...