2015-01-06 8 views
5

Я пытаюсь найти способ заставить пользователя реализовать интерфейс или расширить класс для создания нескольких конструкторов. Я думал, что способ сделать это - создать абстрактный конструктор в абстрактном классе, но я понял, что не могу этого сделать.Java abstract class, abstract constructor

Как я могу решить эту проблему? Есть ли способ заставить пользователя создать конкретный конструктор?

Спасибо!

+1

Что Конструкторы вы хотите реализовать (и почему)? – ErstwhileIII

+0

Пустой конструктор и конструктор копирования. Однако я поставил вопрос, потому что хочу знать в общих целях. – yonutix

ответ

6

No Но так как конструкторы часто заменяются фабричными методами, вы можете реализовать абстрактные методы фабрики или просто другие шаблоны, такие как шаблон builder.

+1

Заводские методы - хорошее предложение здесь. – vikingsteve

4

Нет, нет.

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

+0

Спасибо, мне лучше реализовать метод с именем newInstance в интерфейсе, реализованном классом. – yonutix

3

Вы не можете создать abstract конструктор, но вот обходной путь, который вы можете сделать:

Реализовать abstract класс со всеми конструкторами, которые вы хотите пользователю осуществить. В каждом из них у вас будет один оператор, который ссылается на метод abstract этого класса, реализация которого будет в подклассе. Таким образом вы заставите пользователя предоставить тело для конструктора посредством реализации абстрактного метода. Например:

public abstract class MyAbstractClass { 
    public MyAbstractClass(int param) { 
     method1(param); 
    } 

    public MyAbstractClass(int param, int anotherParam) { 
     method2(param, anotherParam); 
    } 

    protected abstract void method1(int param); 

    protected abstract void method2(int param, int anotherParam); 
} 

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

public class MyClass extends MyAbstractClass { 
    public MyClass(int param) { 
     super(param); 
    } 

    public MyClass(int param, int anotherParam) { 
     super(param, anotherParam); 
    } 

    public void method1(int param) { 
     //do something with the parameter 
    } 

    public void method2(int param, int anotherParam) { 
     //do something with the parameters 
    } 
} 
+0

Хороший ответ спасибо – yonutix

+0

Добро пожаловать. –

+0

Однако простой метод фабрики оказался лучшей идеей. – yonutix