2016-09-15 6 views
0

Итак, у меня есть класс объекта Item и класс объекта Trap. Эти две переменные обмена называются name и icon. Я хочу, чтобы оба этих класса могли быть помещены в один массив с именем special и иметь доступ к компонентам Item и Trap с использованием special. Вот мой код, который мне нужно для работы.Один массив, содержащий разные классы объектов

if (special[x][y] == null) 
    return 0; 
System.out.print(special[x][y].icon); /* here's where the issue is */ 
return 1; 

Что должно быть special быть массивом? Должен ли я использовать интерфейс? И если да, то как? Я читал везде, но я не знаю, как описать мою проблему.

+0

Что вы храните в специальном? Как он инициализируется и заполняется? Расширяет ли класс Trap класс Item? –

+0

@MichaelPickett Я не знаю, как я должен его инициализировать. 'Trap' и' Item' - это совершенно разные классы, но имеют две переменные.'special' должен хранить много разных экземпляров' Trap' и 'Item'. –

ответ

3

Дайте этому попытку:

class Base 
{ 
    String name; 
    Icon icon; 
} 

class Item extends Base { } 

class Trap extends Base { } 

List<Base> special = new ArrayList<>(); 

в качестве альтернативы, вы можете сделать Base интерфейс, и использовать implements ключевое слово вместо extends для Item и Trap.

+0

Я думаю, что это правильный ответ. Дайте мне секунду, чтобы внести изменения и скомпилировать. –

+0

Извините, я ошибся, конечно, это не может быть 'Base [] special', это должно быть' List special'. –

+2

Спасибо за этот ответ. Скомпилированный без ошибок, работал точно так, как я этого хотел. Я видел это раньше, но ничего не думал об этом. Формат, в который вы положили свой ответ, очень помог. –

1

Одним из способов, который может работать, является использование суперкласса (класс, абстрактный класс, интерфейс для всех работ). Это плохое имя для суперкласса, но я уверен, что вы получите идею:

public class Thing { 
    String icon; // Every class that extends Thing has an icon 
    String name; // Every class that extends Thing has a name 

    public Thing(String newIcon, String newName) { 
     icon = newIcon; 
     name = newName; 
    } 

    public String getIcon() { 
     return this.icon; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 

public class Trap extends Thing { 
    public Trap() { 
     super("newIcon", "newName"); // Sets this Traps's name and icon values 
    } 
} 

public class Item extends Thing { 
    public Item() { 
     super("newIcon", "newName"); // Sets this Item's name and icon values 
    } 
} 

Вы можете добавить любые методы/переменные, которые вы хотите Trap и пункт, и, до тех пор, как они сами по себе, они будут работать.

0

Соображения, связанные с: Item и Trap которые содержат методы, которые они должны использовать.

public interface GameObject { 
    String getName(); 
    Image getIcon(); 
} 

Вы можете создать Item и Trap классов, реализующие этот интерфейс. Например

public class Trap implements GameObject { 
    private String name; 
    private Image icon; 
    public GameObject(String name, Image icon) { 
     this.name = name; 
     this.icon = icon; 
    } ... 

Объявив этот класс реализует GameObject это означает, что мы должны создать getName и getIcon методы. Вы делаете это, используя аннотацию @Override.

public class Trap implements GameObject { 
    private String name; 
    private Image icon; 
    public GameObject(String name, Image icon) { 
     this.name = name; 
     this.icon = icon; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 
    @Override 
    public Image getIcon() { 
     return icon; 
    } 
} 

Теперь, когда он реализует GameObject мы можем добавить его в список, который содержит GameObject типов

List<GameObject> special = new ArrayList<>(); 
myList.add(new Trap(myTrapName, myTrapImage)); 
myList.add(new Item(myItemName, myItemImage)); 

Затем можно вызывать методы, не беспокоясь о том, что особенно GameObject является Item или Trap

for (GameObject obj : special) { 
    System.out.println(obj.getName()); 
} 
0

Вы должны использовать интерфейс

public interface SpecialInterface{ 
    //you actually do not need any code, usually interfaces are called something+able 
    String getIcon();//this method will be filled in all the objects implementing this interface 
} 

Итак, теперь вы реализуете интерфейс в обоих классах, например:

public class Trap implements SpecialInterface{ 
    //... 
} 

Теперь, когда вы хотите перебрать свои вещи и ловушки, вы можете сделать что-то вроде:

System.out.println(special[x][y].getIcon()); 

или ..

if(special[x][y] instanceof Trap){ 
    Trap oneTrap = (Trap) special[x][y]; //here you transform your SpecialInterface object in a Trap object 
    System.out.println(special[x][y].icon); 
}else{ 
    Item oneItem = (Item) special[x][y]; 
    System.out.println(special[x][y].icon); 
} 

Примечание: объекты вашей ловушки и предмета должны быть b е объявлен как:

SpecialInterface trap = new Trap(); 

или

SpecialInterface item = new Item(); 

В противном случае вы не можете вставить это объекты в вашей матрице.

0

Что должно быть особенным? Должен ли я использовать интерфейс? И если да, то как?

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

Я бы посоветовал вам получить доступ к элементам с помощью методов доступа (например, getIcon()). Если вы настаиваете на доступе к ним напрямую, как в вашем примере, тогда опция интерфейса невозможна, и члены, к которым вы хотите получить доступ, должны принадлежать суперклассу (или одному из его суперклассам).

Например,

public interface GameObject { 
    String getName(); 
    Icon getIcon(); 
} 

public class Trap implements GameObject { 

    private final String name; 
    private final Icon icon; 

    public Trap(String name, Icon icon) { 
     this.name = name; 
     this.icon = icon; 
    } 

    @Override 
    public String getName() { 
     return name; 
    } 

    @Override 
    public Icon getIcon() { 
     return icon; 
    } 
} 

(... и похоже на Item ...)

GameObject[][] special = /* ... */; 

    // ... 

    if (special[x][y] == null) { 
     return 0; 
    } 
    System.out.print(special[x][y].getName()); 
    return 1; 
0
public class Entity { 
    String name; 
    Icon icon; 
} 

public class Item extends Entity { 
    ... 
    ... 
} 

public class Trap extends Entity { 
    ... 
    ... 
} 


Entity[][] special = new Entity[5][10]; 

и теперь вы можете вставить любой из двух классов в special 2D массива и вы можете использовать тот же самый код, который вы поставили в своем вопросе.

if (special[x][y] == null) 
    return 0; 
System.out.print(special[x][y].icon); /* here's where the issue is */ 
return 1; 
Смежные вопросы