Найти информацию о классе в Java, дизайн программного обеспечения? - PullRequest
3 голосов
/ 01 августа 2010

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

Как лучше всего определить длину массива, в котором нуждается класс?Я мог бы: (A) потребовать, чтобы у каждого производного класса был статический метод, возвращающий длину.Однако базовый класс не может обеспечить это, так как абстрактные статические методы не работают в Java.(B) Каждый производный класс имеет конструктор без аргументов, и я создаю такие классы только для того, чтобы иметь возможность вызывать метод countParameters (), который I может принудительно применить из базового класса.Это кажется «грязным», так как я не заинтересован в создании такого объекта, но мне нужна только некоторая информация о нем.

Причина в том, что я создаю графический интерфейс, который дает пользователю возможность создавать экземплярыПроизводные классы, но каждый производный класс принимает различное количество параметров.То есть мне нужно знать, как нарисовать графический интерфейс, прежде чем я смогу создать классы.

РЕДАКТИРОВАТЬ: я мог бы просто потребовать, чтобы каждый класс Derived имел закрытый конструктор без аргументов и используя рефлексию, которую я могу вызватьметод countParameters ().

EDIT2: На самом деле меня интересует, каковы имена параметров.То есть, если у класса Derived есть конструктор

public Derived(double name1,double name2,...)

, мне нужен способ для генерации массива String []

{name1,name2,...}

Я думаю, это было бы невозможно сделать без созданияэкземпляр класса, но для того, чтобы пользователь мог создать такой класс, ему / ей нужны имена параметров!Момент 22.

Ответы [ 4 ]

5 голосов
/ 01 августа 2010

Похоже, вам нужен Заводской шаблон .

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

Если у вас есть что-то вроде Shape, с ThisShape и ThatShape в качестве производных классов, то ShapeCreator выполнит работу по созданию определенного набора фигур, поддерживаемых вашей программой, предоставив каждому из них необходимые аргументы.

0 голосов
/ 01 августа 2010

Я бы пошел с методом А. Вы не можете заставить компилятор навязать существование такого метода, но вы наверняка можете применить его в своей программе - ни метода, ни работы!

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

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

SubClassTaking2Args
SubClassTaking3Args
...

и требует от ваших сабов реализации одного из них в качестве интерфейса маркера. Но это просто бюрократия с чуть большим эффектом.

0 голосов
/ 01 августа 2010
how about this code:

public absract Base {

   public abstract int size();

   public Base(Object[] objs) {
      if (objs.length != size()) {
         throw new IllegalArgumentException();
      }
    //rest of your code.
}

каждый дочерний класс должен реализовывать метод размера.

надеюсь, что это поможет.

0 голосов
/ 01 августа 2010

Не совсем понятно, чего вы пытаетесь достичь, но мне интересно: действительно ли подклассы должны принимать один параметр с массивом, а не список параметров?

Constructor<?> ctor = Test.class.getConstructors()[0];
int parameterCount = ctor.getParameterTypes().length;
ctor.newInstance(new Object[parameterCount]);
...