2015-12-23 7 views
2

Как хранить 2 разных объекта в массиве? Поэтому, когда у меня есть, например, объект Worker («name», «age», Payroll), тогда еще один объект, который является Computer («цена», «спецификация», «...»). И я храню эти объекты в классе.магазин 2 разных объекта в массиве

class Record 
{ 
    top = -1; 
    private Worker array_w[]; 
    private Computer array_c[]; 

Но тогда я должен сделать это:

public void insert(Worker number) { 
    if ((top + 1) < array_w.length) 
    { top += 1; array_w[top] = number; } 

public void insert(Computer number) { 
    if ((top + 1) < array_c.length) 
    { top += 1; array_c[top] = number; } 
} 

для вставки каждого объекта в новый класс.

Как сделать так, чтобы хранился только один массив.

+1

Я полагаю, у вас может быть массив 'object', но я бы не рекомендовал его. Это не очень хорошая идея - смешивать два разных объекта, которые, на первый взгляд, не имеют никакой связи друг с другом. –

+1

Как и примечание, массивы не будут автоматически расти, когда вы добавите массив в индекс 'top + 1', если вы не объявили массив с дополнительным пространством (в этом случае вам придется отслеживать). Возможно, вам захочется использовать ArrayList или аналогичную структуру данных для добавления/удаления элементов по запросу. – element11

+0

Ну, я хочу напечатать каждый объект из класса Record. И мне трудно распечатать его прямо сейчас, потому что есть два массива, но когда у меня был только один тип объекта (Рабочий), у меня был один массив, и программа работала. Поэтому я пытаюсь иметь только один массив. Это также меньше кода, потому что мне не нужно вводить все дважды. – Daniel

ответ

6

Я бы посоветовал против смешивания объектов, но если вы должны иметь один массив, есть несколько вещей, которые вы могли бы сделать:

У обоих объектов наследуют же объект, или Реализовать один и тот же интерфейс:

public class Worker extends MyMainClass 
public class Computer extends MyMainClass 

ИЛИ

public class Worker implements IMyInterface 
public class Computer implements IMyInterface 

Вы затем:

MyMainClass[] myArray; 

ИЛИ

IMyInterface[] myArray; 

(Предпочтительно интерфейс)

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

public class Wrapper { 
    private Worker worker; 
    private Computer computer; 
    ... 
} 

public void insert(Wrapper wrapper) { 
    ... 
} 

И тогда у вас есть массив:

Wrapper[] myArray; 
+1

Наверное, лучше использовать коллекцию, а не массив []. – Eugene

+0

Я пытаюсь использовать интерфейс. Но я не уверен, как создать массив в классе Record. – Daniel

+1

@ Проверка Daniel http://stackoverflow.com/a/34437681/1085186 – StackFlowed

2

Я предполагаю, что у вас есть общий интерфейс или класс выше класса «Компьютер» и «Рабочий». Если это так, вы могли бы сделать что-то вроде:

MyTopInterface[] array = .. 

Теперь вы можете просто использовать тот же массив и заполнить либо работник или объекты компьютера в нем.

3

Это не очень хороший дизайн, но если вы хотите, чтобы то, что вы могли бы сделать, это

Сначала создайте интерфейс:

public interface MarkerInterface { 
    public String print(); 
} 

Затем использовать, что для реализации обоих классов

public class Worker implements MarkerInterface { 
    ... 
    @Override 
    public String print() { 
     return "worker class what ever you want to print" 
    } 
} 

public class Computer implements MarkerInterface { 
    ... 
    @Override 
    public String print() { 
     return "computer class what ever you want to print" 
    } 
} 

Теперь создайте массив в классе записей

public class Record 
{ 
    MarkerInterface[] objects = new MarkerInterface[10]; 
    ... 
} 

Теперь вы можете создать массив типа MarkerInterface и сохранить их оба.

Помните, когда вы хотите использовать объект из массива нужно сделать

if(obj isinstanceof Computer) {...} else if(obj isinstanceof Worker) {...} 

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

System.out.println(obj.print()); 
1

Вы могли использовать массив объектов или общий базовый класс

private Object [] data; 

, но тогда у вас были бы instanceof Computer и instanceof Worker повсюду. И подумайте о том, «сколько компьютеров для Рабочего есть?» - простое разделение против цикла и подсчета.

Мой совет: оставляйте отдельные элементы. Может быть List <Computer> вместо массива даже.

1

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

class OneOf<A, B> { 

    A a; 
    B b; 

    public A getA() { 
     return a; 
    } 

    public OneOf setA(A a) { 
     this.a = a; 
     this.b = null; 
     return this; 
    } 

    public B getB() { 
     return b; 
    } 

    public OneOf setB(B b) { 
     this.b = b; 
     this.a = null; 
     return this; 
    } 

    @Override 
    public String toString() { 
     return a != null ? Objects.toString(a) : Objects.toString(b); 
    } 

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