2015-01-06 20 views
5

Ich versuche einen Weg zu finden, den Benutzer zu zwingen, der eine Schnittstelle implementieren wird oder eine Klasse erweitern wird, um mehrere Konstruktoren zu erstellen. Ich dachte mir, dass es eine Möglichkeit wäre, einen abstrakten Konstruktor in einer abstrakten Klasse zu erstellen, aber ich habe herausgefunden, dass ich das nicht kann.Java abstrakte Klasse, abstrakte Konstruktor

Wie kann ich dieses Problem lösen? Gibt es eine Methode, um den Benutzer zum Erstellen eines bestimmten Konstruktors zu zwingen?

Danke!

+1

Welche Konstrukteure wollen Sie implementiert (und warum)? – ErstwhileIII

+0

Ein leerer Konstruktor und ein Kopierkonstruktor. Jedoch stelle ich die Frage, weil ich für einen allgemeinen Zweck wissen möchte. – yonutix

Antwort

6

Nr. Aber da Konstruktoren oft durch Factory-Methoden ersetzt werden, könnten Sie abstrakte Factory-Methoden oder nur andere Muster wie das Builder-Muster implementieren.

+1

Factory-Methoden ist ein guter Vorschlag hier. – vikingsteve

4

Nein, gibt es nicht.

Sie könnten jedoch ein Unit-Test-Framework erstellen, das Reflektion ausnutzt, um sicherzustellen, dass die richtigen Konstruktoren vorhanden sind.

+0

Danke, ich würde besser eine Methode namens newInstance in der von der Klasse implementierten Schnittstelle implementieren. – yonutix

3

Sie können einen abstract Konstruktor nicht schaffen, aber hier ist eine Abhilfe, die Sie tun können:

alle eine abstract Klasse implementieren mit den Konstrukteuren Sie der Benutzer implementieren möchten. In jedem von ihnen haben Sie eine einzelne Anweisung, die sich auf eine abstract-Methode aus dieser Klasse bezieht, die sich in der Unterklasse befindet. Auf diese Weise werden Sie den Benutzer zwingen, über die abstrakte Methodenimplementierung einen Körper für den Konstruktor bereitzustellen. Zum Beispiel:

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); 
} 

In der Implementierung werden Sie Umsetzung dieser beiden Methoden zur Verfügung zu stellen gezwungen, die die Körper der beiden Konstrukteure darstellen kann:

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

Schöne Antwort danke – yonutix

+0

Gern geschehen. –

+0

Die einfache Fabrikmethode erwies sich jedoch als eine bessere Idee. – yonutix