Java - общая обработка создания подклассов - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть три класса, которые очень похожи, за исключением одного метода. Поэтому я решил поместить все их функциональные возможности в абстрактный суперкласс. Однако когда дело доходит до создания экземпляров этих классов, я не понимаю, как реализовать то, что мне кажется «очевидным» или «элегантным» подходом. Их конструкторы практически идентичны, и мне нужно несколько экземпляров каждого, поэтому я хотел сделать что-то вроде следующего:

private SubclassA[] subclassA_array, SubclassB[] subclassB_array, SubclassC[] subclassC_array;
subclassA_array = new SubclassA[getNumInstancesOfClassANeeded()]
subclassB_array = new SubclassA[getNumInstancesOfClassBNeeded()]
subclassC_array = new SubclassA[getNumInstancesOfClassCNeeded()]

// might have my syntax wrong here; array of the three subclass arrays
private Superclass[][] superArray = new Superclass[][3];
superArray[0] = subclassA_array;
superArray[1] = subclassA_array;
superArray[2] = subclassA_array;
for ( Superclass[] array: superArray )
    for(int i = 0; i< array.length; i++)
      //  array[i] = new..... what goes here?
    }
}

Как мне найти подходящий класс для конструирования в этом самом внутреннем цикле? Действительно ли это действительно странный способ решения проблемы; я пропустил что-то более очевидное? Должен ли я просто сказать "к черту это!" и просто есть три отдельных цикла?

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Должен ли я просто сказать "к черту это!" и просто есть три отдельных цикла?

ИМО, да.


Вы можете сделать следующее:

  1. Используйте array.getClass(), чтобы получить класс массива,
  2. Используйте getConmponentType(), чтобы получить базовый тип массива
  3. Используйте newInstance() для создания экземпляра
  4. Назначить ссылку на экземпляр для массива.

... но это приводит к хрупкому коду и все равно, что использовать кувалду для взлома грецкого ореха.

0 голосов
/ 28 сентября 2011

Вы можете создать статический метод.

public static subclassA[] getNewInstances(int numberOfInstances);

Доступ к статическим методам возможен без необходимости создания нового экземпляра SubclassA.getNewInstances(3).

. В вашем определении матрицы вам нужноопределить сначала первое измерение (так оно становится new Superclass[3][]

0 голосов
/ 28 сентября 2011

Вы можете работать с отражением во внутреннем цикле, что-то вроде array.getClass().getComponentType().newInstance(), но я думаю, что могут быть более эффективные решения для общей проблемы (Чтобы ответить на это, мне нужно больше информации о том, что вы хотите кодировать)

...