Можно ли переопределить тип аргумента переопределенного метода? - PullRequest
0 голосов
/ 02 апреля 2019

Может кто-нибудь помочь мне с кодом ниже?

У меня есть 2 класса Controller1 и Controller2, реализующих контроллеры интерфейса, как показано ниже:

package com.controllers
public interface Controllers{
    public void method1(*****);
}
------------------------------
package com.controllers
public class Controller1{
    public void method1(com.model1.Module1 module);
}
------------------------------
package com.controllers
public class Controller2{
    public void method1(com.model2.Module1 module);
}
------------------------------

У меня есть 2 пакета, которые имеют одинаковые классы (оба класса имеют одинаковые методы), как показано ниже

package com.model1
public class Module1{

}
------------------------
package com.model1
public class Module2{

}
-----------------------
package com.model2
public class Module1{

}
------------------------
package com.model2
public class Module2{

}

Я использую класс Factory для получения экземпляра Controller1 или Controller2 во время выполнения, поэтому типы аргументов для method1 в унаследованных классах будут различаться. Но я не могу этого сделать, поскольку сигнатура метода не может быть переопределена.

Может кто-нибудь предложить мне альтернативу? Спасибо ...

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

В любом случае, если вы не хотите использовать методы Module1 или Module2, вы можете создать пустой интерфейс с именем Method, и это будет решением.Если вы хотите использовать их методы, вы можете сделать то же самое и добавить что-то подобное (читайте об отражении в Java)

package com.controllers
public interface Controllers{
    public void method1(Model model) {
        if (model instanceof com.model1.Module1) {
            com.model1.Module1 module = (com.model1.Module1) model;
            ...
        } else if (model instanceof com.model2.Module1) {
            com.model2.Module1 module = (com.model2.Module1) model;
            ...
        }
    }
}
0 голосов
/ 03 апреля 2019

Почему бы вам не использовать некоторые дженерики?

вот так:

public class Example {

    public static void main(String[] args) {

        Object module = new Random().nextBoolean()? new Module2(): new Module1();
        Factory factory = new Factory();
        Controllers produce1 = factory.produce(module.getClass());
        produce1.method1(module);

    }
}

class Factory {

    Controllers produce(Class<?> clz) {
        if (Module1.class.equals(clz)) return new Controller1();
        if (Module2.class.equals(clz)) return new Controller2();
        throw new IllegalArgumentException();
    }

}

interface Controllers<T> {
    void method1(T t);
}

class Controller1 implements Controllers<Module1> {

    public void method1(Module1 integer) {
        System.out.println("in 1!");
    }
}

class Controller2 implements Controllers<Module2> {

    public void method1(Module2 module) {
        System.out.println("in 2!");
    }
}


class Module1 {

}

class Module2 {

}
0 голосов
/ 02 апреля 2019

У меня есть 2 пакета, которые имеют одинаковые классы (оба класса имеют одинаковые методы)

Почему вы не создали общий родительский интерфейс для Module1, Module2 тогда?

Это будет выглядеть как

package com.model1
public class Module1 implements Model {

}
------------------------
package com.model1
public class Module2 implements Model{

}
-----------------------
package com.model2
public class Module1 implements Model{

}
------------------------
package com.model2
public class Module2 implements Model{

}

И

package com.controllers
public interface Controllers{
    public void method1(Model model);
}

Но, может быть, я что-то упустил в вашем вопросе

...