Создание метода, способного распознавать тип параметра и соответственно вызывать их общие методы - PullRequest
2 голосов
/ 19 марта 2019

Ниже приведен пример трех методов, которые имеют практически одинаковых инструкторов, за исключением первого (Tile, Primitive, Cube).

Предположим, что для этих объектов также существуют следующие методы:

Tile.set(int a, int b, int c){ ... }
Primitive.set(int a, int b, int c){ ... }
Cube.set(int a, int b, int c){ ... } 

Теперь вот 3 различных метода, которые используют эти методы выше:

void first(Tile tile, int a, int b, int c){
    tile.set(a,b,c);
}

void second(Primitive tile, int a, int b, int c){
    tile.set(a,b,c);
}

void third(Cube tile, int a, int b, int c){
    tile.set(a,b,c);
}

У меня вопрос, возможно ли создать что-то вроде метода монстра, который распознает, если tile (мои данные) это Tile, Primitive или Cube, если предположить, что все они имеют метод .set ?

Примерно так:

void monster(Anything tile, int a, int b, int c){
    tile.set(a,b,c);
}

// для lolo //

Хотя я знаю, что это неправильно, поскольку в методе есть 3 инструктора с одинаковым именем, он должен выбрать только 1 из 3, независимо от того, какой тайл:

void monster(Tile tile, Primitive tile, Cube tile, int a, int b, int c){
    tile.set(a,b,c);
}

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Да, вы можете использовать шаблон стратегии с использованием интерфейсов. Вы можете узнать это по instanceof

if (dog instanceof Dog) System.out.println("dog is an instanceof Dog");

Чтобы быть более конкретным в вашем вопросе, например:

public interface ISet {

    void set(int a, int b, int c);

}

public class Cube implements ISet {
    @Override
    public void set(int a, int b, int c) {

    }
}

public class Primitive implements ISet {
    @Override
    public void set(int a, int b, int c) {

    }
}


public class Tile implements ISet {
    @Override
    public void set(int a, int b, int c) {

    }
}

public static void main(String[] args) {
    ISet set = new Cube(); //just an example. it can be given
    if (set instanceof Cube) {
        System.out.println("instanceof Cube");
    }
}

public class A {
    public void set(ISet set) {
        set.set(0 ,0, 0);
    }
}
1 голос
/ 19 марта 2019

Создать интерфейс Shape:

interface Shape {
    void set(int a, int b, int c);
}

class Tile implements Shape {

    @Override
    public void set(int a, int b, int c) {
    }

}

class Cube implements Shape {

    @Override
    public void set(int a, int b, int c) {
    }

}

И теперь вы можете назвать это как:

class Test {

   public static void acceptGenericType(Shape shape) {
      shape.set(shape.getA(), shape.getB(), shape.getC());
   }

   public static void main(String[] args) {
      Shape tile = new Tile();
      acceptGenericType(tile); // calls Tile's set()
   }
}

Таким образом, вы вызываете только set() из , который конкретный экземпляр.

1 голос
/ 19 марта 2019

Да, Наследование. Иметь базовый класс с методом set. Сделайте метод set виртуальным и переопределите его в классе Tile Primitive и Cube Тогда просто назовите это как:

void monster(BaseClass tile, int a, int b, int c)
{
   tile.set(a,b,c)
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...