Приносим извинения, если на этот вопрос уже был дан ответ, хотя у меня был обширный взгляд, но я не смог найти ответ. Чтобы подвести итог ситуации, я пытаюсь создать программу симулятора, которая имеет дело с разными существами хищника и жертвы, и в настоящее время проблема состоит в том, чтобы заставить каждого существа проверить, к какому типу существа оно относится, и я бы предпочел проверить, экземпляр принадлежит к одному и тому же объекту.
Так скажи, например, я сделал это:
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]), потому что они имеют разные атрибуты, и это будет проверять, являются ли они одинаковыми.
Любые идеи/предложения будут приветствоваться. Благодарю!
Вам нужно изучить Полиморфизм (http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html). Вы объявляете Существо в качестве базового класса (или интерфейса) и расширяете/реализуете из класса Существо для каждого типа существа, которое у вас есть. Каждый подкласс будет реализовывать свои собственные методы, чтобы переопределить Существо и позволить вам правильно использовать методы, а также обнаруживать тип, используя метаданные класса, которые будут иметь каждый экземпляр.
Один из вариантов (и, возможно, лучший в долгосрочной перспективе, см. Ответы от @AlexC и @Don) заключается в создании подклассов Существа, называемых Fish, Shark, Penguin и т.д. Затем вы можете использовать instanceof
.
Чтобы совместить это с полиморфизмом, вы должны добавить метод public boolean eats(Creature other)
В стороне, когда я помогал присматривать за 4-летним ребенком, его любимая игра с маленькими пластиковыми фигурами животных была "то, что ест" с громкими воплями восторга,
return false;
(хотя, возможно, рыбы едят рыбу?)return other instanceof Fish;
return true;
Другой вариант - иметь поле Существа, которое его описывает. Возможно, перечисление или String для латинских классификационных названий. Затем вы можете использовать что-то вроде genus.equals("Carcharodon")
для Shark или latinName.contains("Spheniscidae")
для пингвинов.
if (gridloc[x][y] instanceof Fish)
as fish тогда будет объектом класса. В настоящее время все существа имеют методы setType и getType, которые получают / возвращают строку + итератор, например «Fish 3» для идентификации каждого из них :) Эта информация вместе с уровнем голода и возрастом отображается на экране в информационном окне, когда вы нажмите на существо.
Это проблема с вашим дизайном. Вы должны создать суперкласс под названием "Существо" и подкласс для рыбы, пингвина и всех остальных. Затем создайте массивы с этими типами подкласса. Затем вы можете выполнить проверку экземпляров с соседними объектами сетки.
Этот дизайн основан на полиморфизме. В конечном итоге это лучший подход, поскольку код более чистый и структурированный. Если вы сделаете так, даже через несколько лет, когда вы посмотрите на код; все же это будет иметь смысл.
Возможно, существо должно быть перечислением...
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!");
}
}
}
}