2015-06-25 4 views
1

Я создаю игру открытого мира, где каждое «место» составлено из «под-мест» Например, у меня есть Farm.java class, который графически представлен матрицей суб- места: дом, пруд, сад и поле, и пользователь может «переместиться» через эту матрицу и взаимодействовать с разными местами.Матрица объектов из разных классов в java

Итак, в объекте Farm мне нужна матрица подсетей/массив, которая содержит объект дома, объект пруда, объект сада и объект поля (все разные классы). Я хотел бы сделать следующее:

SubPlace[][] map = new SubPlace[1][1] 

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

Я хочу, чтобы матрица выглядеть следующим образом:

map[0][0]= new House(); 
map[0][1]= new Pond(); 
map[1][0]= new Field(); 
map[1][1]= new Garden(); 

Как я могу это сделать, когда все эти разные классы? Нужно ли им расширять/наследовать/или что-то из общего класса SubPlace? Или есть другой способ вытолкнуть все эти объекты в матрице?

ответ

2

Использование наследования -

class Place {} 
class Farm extends Place {} 
class Pond extends Place {} 
class House extends Place{} etc... 

Place[][] map = new Place[1][1]; 
map[0][0] = new Farm(); 
2

Все объекты java в конечном счете расширяют java.lang.Object, поэтому в худшем случае вы всегда можете использовать Object[][]. Но это нелегко. Как и вы предложили, лучшим способом было бы извлечь базовый класс (или интерфейс), например SubPlace, который будет содержать общие методы, необходимые для выполнения всех объектов карты (например, draw()).

0

Да, вы должны иметь интерфейс SubPlace и осуществлять любые места, которые вы want.I предоставили макет

interface SubPlace { 

} 

class House implements SubPlace { 

} 

class Pond implements SubPlace { 

} 

class Field implements SubPlace { 

} 

class Garden implements SubPlace { 

} 

public class GUI { 

    public static void main(String[] args) { 
     SubPlace[][] map = new SubPlace[1][1]; 
     map[0][0] = new House(); 
     map[0][1] = new Pond(); 
     map[1][0] = new Field(); 
     map[1][1] = new Garden(); 
    } 
} 
1

Я думаю, что то, что вы хотели сделать это программа interface.

Я хотел бы обратиться к одному из моих любимых ответов в StackOverFlow, которые объясняют what does it mean to program an Interface. Пример, используемый в нем, вероятно, является одним из лучших, что я когда-либо читал.

В вашем случае все классы, такие как Pond, Field, Garden, будут реализовывать интерфейсный интерфейс.

1

Существует два общих подхода. Вы можете использовать Interfaces или Abstract Classes. Оба имеют целью предоставить некоторые контракты (главным образом в форме методов) для остальной части программы. Каждый из ваших SubPlace s может иметь определенные свойства, например. Image, чтобы вы могли определить метод public Image getImage().

Когда использовать что? Говоря производительность, абстрактные классы - slightly faster than interfaces, но это не должно влиять на ваше решение. Вы можете использовать абстрактный класс, если части, которые вы используете, имеют один и тот же вид. Например, Ford и Porsche оба являются CarManifacturer. Если, однако, части принципиально разные, вы можете использовать интерфейс вместо этого. Printable - хороший пример: Page может быть доступен для печати, а также Image или RCHelicopter (3D-принтер ...).

Обратите внимание, что вы можете использовать интерфейсы, если вы уже используете наследование (поскольку Java не разрешает многоуровневое).

Есть случаи, когда вы действительно можете использовать оба варианта. Thread - хороший пример: Чтобы получить работу Thread, вы можете позволить вашему классу extends Thread, а затем start() экземпляр этого класса. Еще одна распространенная возможность начать поток (особенно с появлением Java 8 и lambdas) - передать Runnable в качестве аргумента для конструктора Thread. Пользователь имеет оба варианта и может выбрать, какой из них использовать.

В вашем случае, я думаю, что абстрактный класс должен выполнять эту работу.

Смежные вопросы