Java: Как проверить, к какому объекту принадлежит экземпляр?

1

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

Так скажи, например, я сделал это:

private class Creature {
...
Creature [] fish = new Creature();
Creature [] shark = new Creature();
Creature [] penguin = new Creature();
}

а затем создал несколько экземпляров (существ) каждого типа в цикле:

for (int f=1;f<rnd;f++) {
fish[f] = new Creature();
//set attributes of creature

и тогда программа может определить, где они расположены по отношению друг к другу, я создал такую сетчатую систему:

Creature [][] gridloc = new Creature[x][y]; //relates to number of spaces tiles that determines movement.
Creature [] crloc = new Creature[tc]; //stores a reference to all creatures created.
...

crloc[tc] = fish[f]; gridloc[x][y]=crloc[tc] //or fish[f]
}

Так или иначе, я суммировал код там довольно много, что все работает, но когда каждое существо проверяет рядом с ним в gridloc для того, что есть, например, хищник, я не знаю, как проверить, найдет ли это другое существо определить, является ли это экземпляром одного и того же типа объекта или другого. Итак, что-то вроде:

if (!gridloc[x][y].getObject().equals(gridloc[x+1][y].getObject()) //if the current creature is not the same as the one next to it.

Я знаю такие вещи, как instanceof, но работает только с проверкой того, является ли объект экземпляром класса, а не если экземпляр принадлежит к одному типу объекта. Я также не могу просто использовать fish [1].equals(fish [2]), потому что они имеют разные атрибуты, и это будет проверять, являются ли они одинаковыми.

Любые идеи/предложения будут приветствоваться. Благодарю!

  • 0
    «Экземпляр, принадлежащий объекту» - не получены термины, которые вы используете. Сам объект является экземпляром класса.
  • 0
    Извините, да, вы правы в моей ситуации: существо - это класс, а рыба, акула и пингвин - примеры этого класса. объекты. Однако затем я создаю несколько экземпляров этих объектов, и мне нужно знать, является ли, например, рыба 1 такой же, как рыба 2, поскольку она происходит от объекта рыбы, но НЕ совпадает с акулой 1, как это происходит от другого объекта.
Показать ещё 2 комментария
Теги:
object
arrays
equals
instance

4 ответа

5
Лучший ответ

Вам нужно изучить Полиморфизм (http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html). Вы объявляете Существо в качестве базового класса (или интерфейса) и расширяете/реализуете из класса Существо для каждого типа существа, которое у вас есть. Каждый подкласс будет реализовывать свои собственные методы, чтобы переопределить Существо и позволить вам правильно использовать методы, а также обнаруживать тип, используя метаданные класса, которые будут иметь каждый экземпляр.

  • 0
    Ааа, я помню полиморфизм ... вы совершенно правы, так что было бы больше смысла и было бы проще определять типы существ и т. Д. Я как бы переучиваю Java на данный момент со времени изучения его в Uni :)
2

Один из вариантов (и, возможно, лучший в долгосрочной перспективе, см. Ответы от @AlexC и @Don) заключается в создании подклассов Существа, называемых Fish, Shark, Penguin и т.д. Затем вы можете использовать instanceof.

Чтобы совместить это с полиморфизмом, вы должны добавить метод public boolean eats(Creature other) В стороне, когда я помогал присматривать за 4-летним ребенком, его любимая игра с маленькими пластиковыми фигурами животных была "то, что ест" с громкими воплями восторга,

  1. В Существо, код будет return false; (хотя, возможно, рыбы едят рыбу?)
  2. В Пингвине код будет return other instanceof Fish;
  3. В Shark код будет return true;

Другой вариант - иметь поле Существа, которое его описывает. Возможно, перечисление или String для латинских классификационных названий. Затем вы можете использовать что-то вроде genus.equals("Carcharodon") для Shark или latinName.contains("Spheniscidae") для пингвинов.

  • 0
    Да, с классами полиморфизма я должен быть в состоянии сделать что-то вроде: if (gridloc[x][y] instanceof Fish) as fish тогда будет объектом класса. В настоящее время все существа имеют методы setType и getType, которые получают / возвращают строку + итератор, например «Fish 3» для идентификации каждого из них :) Эта информация вместе с уровнем голода и возрастом отображается на экране в информационном окне, когда вы нажмите на существо.
2

Это проблема с вашим дизайном. Вы должны создать суперкласс под названием "Существо" и подкласс для рыбы, пингвина и всех остальных. Затем создайте массивы с этими типами подкласса. Затем вы можете выполнить проверку экземпляров с соседними объектами сетки.

Этот дизайн основан на полиморфизме. В конечном итоге это лучший подход, поскольку код более чистый и структурированный. Если вы сделаете так, даже через несколько лет, когда вы посмотрите на код; все же это будет иметь смысл.

  • 0
    Так что я думаю, что нет способа проверить экземпляр объекта, если это не класс. Но потом, как вы говорите, мне нужно немного изменить дизайн, как сказал Алекс :)
1

Возможно, существо должно быть перечислением...

public enum Creature {
    FISH(false), SHARK(true), PENGUIN(true);
    private boolean isPredator;
    private Point gridLocation;

    Creature(boolean isPredator) {
        this.isPredator = isPredator;
    }
    // ...getters/setters
}   

с отдельным классом мирового класса для размещения сетей...

public class World {
    List<Creature> creatures = new LinkedList<>();

    public boolean isNearPredator(Creature c) {
        for (Creature i : creatures) {
            if (i.getGridLocation().distance(c.getGridLocation()) < 2
                    && i.isPredator()) {
                System.out.println("About to get eaten!");
            }
        }
    }
}
  • 1
    Разумно, но в долгосрочной перспективе это может быть сложно, так как он добавляет все больше и больше существ, хочет добавить «Пакет расширения Амазонского дождевого леса» и т. Д. Также обратите внимание, что Пингвин является одновременно и хищником (рыбы), и добыча (Акулы).
  • 0
    Я согласен, что это вызовет проблемы в будущем.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню