Несколько операций в зависимости от типа переданного объекта - PullRequest
2 голосов
/ 03 мая 2010

Предполагается, что я создаю метод, которому передается объект, и этот метод будет выполнять действие в зависимости от переданного объекта. Как мне определить объект?

Я думал об использовании имени класса для идентификации объекта, но это может быть нецелесообразно, так как я мог легко изменить имя класса объектов и генерировать головные боли во время будущей разработки. Я прав?

изменить: например, у меня есть объекты мяч и бомба. если у меня есть другой объект, называемый стеной, и у стены есть метод разрешения столкновений со стеной (например, координаты сталкивающегося шара и бомбы), но у меня другая логика в зависимости от сталкивающегося объекта (то есть шара и бомбы)

Ответы [ 5 ]

7 голосов
/ 03 мая 2010

Вы запрашиваете оператор instanceof.

if (object instanceof SomeClass) {
  // do something
} else if (object instanceof SomeOtherClass) {
  // do something else
}

Однако это не очень хорошая практика. Вместо этого вы можете использовать так называемую двойную диспетчеризацию. Приведите передаваемый объект в соответствие с интерфейсом, который определяет операцию в терминах другого класса. Итак:

public interface ThrowableItem {
   void throwAt(Wall wall);
}

public class Wall {
    void accept(ThrowableItem item) {
        item.throwAt(this);
    }
}

А затем предоставьте соответствующие реализации в Ball и Bomb (оба из которых реализуют ThrowableItem)

Взгляните на Шаблон посетителя - вы можете переместить операции на WallVisitor, который знает, как обрабатывать столкновения для каждого объекта.

0 голосов
/ 03 мая 2010

Вы можете использовать instanceof, но остерегайтесь ловушек. Это будет 'true` для подклассов, как показано ниже:

if (subclass instanceof superclss)  // returns true
0 голосов
/ 03 мая 2010

В зависимости от контекста вы также можете указать разные методы (перегрузка) для разных возможных типов, которые могут быть переданы.

public void doSomething(TypeA object) {
    // TypeA specific stuff
}
public void doSomething(TypeB object) {
    // TypeB specific stuff
}
0 голосов
/ 03 мая 2010

Это зависит от действий. Как они связаны? Это то, что у вас есть несколько объектов, которые делают одно и то же, но немного по-разному? Например, предположим, у меня есть метод, который должен печатать документ, но я хочу, чтобы тот же метод печатал файлы pdf и doc.

Если ваша ситуация похожа на эту, то вы можете рассмотреть возможность использования наследования следующим образом: создайте суперкласс, в моем примере давайте назовем его Document с методом print (). Метод печати не должен ничего делать. Затем создайте подкласс для каждого типа документа, чтобы я в итоге получил подкласс PdfDocument и DocDocument. Каждый из них предоставит реализацию для print (), которая может печатать тип документа, к которому он относится.

Тогда метод, который я напишу, будет:

  public void printDocument(Document d){
        d.print();
  }

То есть, нацеливаясь на тип суперкласса, мне не нужно беспокоиться о конкретных действиях, которые выполняет каждый тип документа. Таким образом я избегаю кода, который проверяет тип объекта, который передается моему методу. Это делает код более надежным для будущего расширения.

0 голосов
/ 03 мая 2010

этот код приведет вас к использованию switch рассмотрите возможность использования полиморфизма. и это автоматически отменит проблему именования.

...