Я пытаюсь настроить иерархию мест в Java. Место может быть большим или маленьким, а более крупные места включают в себя меньшие подлокации. Итак, мир содержит страны, страны содержат города и так далее, вплоть до зданий и комнат.
Я создал абстрактный класс под названием Place, который является родительским для всех этих классов. типы. Каждое место содержит график подлокаций, родительское местоположение и возможность получения родительских подлокаций (то есть соседей)
Основная проблема, с которой я сталкиваюсь, заключается в том, что родительское местоположение подлокации должны быть экземплярами своего класса, но нет возможности указать это с помощью Java.
Я рассматривал возможность жесткого кодирования всех типов, чтобы getParent города возвращал Country и getSublocations возвращают график построения, но это создает некоторые проблемы с изменением функциональности классов или добавлением новых классов, а также требует ужасающего количества копирования кода. Есть ли другие способы решить эту проблему?
РЕДАКТИРОВАТЬ:
Спасибо за все ответы. Это то, что у меня есть до сих пор. Это не идеально, но и не так уж плохо. Единственный код, который мне пришлось скопировать, — это реализация getNeighbors(). Раньше это было реализовано непосредственно в абстрактном классе (this.getParent().getSublocations().getEdges(this) ), но это была всего лишь одна строка кода.
import java.util.HashSet;
public abstract class Place {
//World, Region, City, Building, Room
public enum Direction {
East, Northeast, North, Northwest, West, Southwest, South, Southeast, Invalid;
public static Direction fromInt(int i) {
switch (i) {
case 0: return East;
case 1: return Northeast;
case 2: return North;
case 3: return Northwest;
case 4: return West;
case 5: return Southwest;
case 6: return South;
case 7: return Southeast;
default: return Invalid;
}
}
public static Direction fromAngle(double angle) {
return fromInt((int) (angle+22.5)/45);
}
}
protected final int locked = Integer.MAX_VALUE;
protected int x, y; //longitude and latitude
public abstract String getName();
public abstract Graph getSublocations();
public abstract T getParent();
public abstract HashSet getNeighbors();
public final Direction getDirection(Place otherPlace) {
if (otherPlace == null) {
return Direction.Invalid;
} else if (this.getClass() == otherPlace.getClass()) {
return Direction.fromAngle(Math.atan2(otherPlace.y-y, otherPlace.x-x));
} else {
return Direction.Invalid;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/466 ... subclasses
Создание иерархии подклассов Java ⇐ JAVA
Программисты JAVA общаются здесь
1728551610
Anonymous
Я пытаюсь настроить иерархию мест в Java. Место может быть большим или маленьким, а более крупные места включают в себя меньшие подлокации. Итак, мир содержит страны, страны содержат города и так далее, вплоть до зданий и комнат.
Я создал абстрактный класс под названием Place, который является родительским для всех этих классов. типы. Каждое место содержит график подлокаций, родительское местоположение и возможность получения родительских подлокаций (то есть соседей)
Основная проблема, с которой я сталкиваюсь, заключается в том, что родительское местоположение подлокации должны быть экземплярами своего класса, но нет возможности указать это с помощью Java.
Я рассматривал возможность жесткого кодирования всех типов, чтобы getParent города возвращал Country и getSublocations возвращают график построения, но это создает некоторые проблемы с изменением функциональности классов или добавлением новых классов, а также требует ужасающего количества копирования кода. Есть ли другие способы решить эту проблему?
РЕДАКТИРОВАТЬ:
Спасибо за все ответы. Это то, что у меня есть до сих пор. Это не идеально, но и не так уж плохо. Единственный код, который мне пришлось скопировать, — это реализация getNeighbors(). Раньше это было реализовано непосредственно в абстрактном классе (this.getParent().getSublocations().getEdges(this) ), но это была всего лишь одна строка кода.
import java.util.HashSet;
public abstract class Place {
//World, Region, City, Building, Room
public enum Direction {
East, Northeast, North, Northwest, West, Southwest, South, Southeast, Invalid;
public static Direction fromInt(int i) {
switch (i) {
case 0: return East;
case 1: return Northeast;
case 2: return North;
case 3: return Northwest;
case 4: return West;
case 5: return Southwest;
case 6: return South;
case 7: return Southeast;
default: return Invalid;
}
}
public static Direction fromAngle(double angle) {
return fromInt((int) (angle+22.5)/45);
}
}
protected final int locked = Integer.MAX_VALUE;
protected int x, y; //longitude and latitude
public abstract String getName();
public abstract Graph getSublocations();
public abstract T getParent();
public abstract HashSet getNeighbors();
public final Direction getDirection(Place otherPlace) {
if (otherPlace == null) {
return Direction.Invalid;
} else if (this.getClass() == otherPlace.getClass()) {
return Direction.fromAngle(Math.atan2(otherPlace.y-y, otherPlace.x-x));
} else {
return Direction.Invalid;
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/46696787/creating-a-hierarchy-of-java-subclasses[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия