2014-10-27 5 views
6

Da eine abstrakte Klasse kann nicht instanziert werden, und da geschützt Mitglieder Subklassen immer sichtbar sind, so scheint es, dass es keinen Unterschied macht, ob seine Konstrukteure sind öffentlichen oder geschützt.Gibt es einen Punkt in einer abstrakten Klasse, die einen öffentlichen Konstruktor anstelle eines geschützten Konstruktors hat?

Gibt es ein Beispiel, bei dem ein öffentlicher Konstruktor einen Unterschied zu einem geschützten machen könnte? Ich würde normalerweise die restriktivste Zugangsstufe bevorzugen, die anwendbar ist.

+1

Die Antwort hängt von den Bedürfnissen der Klasse ab. Sie können mehr als eine "Abstract" -Implementierung der Klasse haben, die die Basiskonfiguration bereitstellt, aber eine oder mehrere Methoden benötigt, die von der konkreten Klasse implementiert werden. Dies könnte getan werden, um die Anzahl der Wiederholungen zu reduzieren, die für die Implementierung Ihrer abstrakten Basisklasse erforderlich sind, z. B. ... – MadProgrammer

+1

Zugehörige (für C#): http://stackoverflow.com/questions/4532233/protected-vs-public -constructor-for-abstract-Klasse-is-there-a-difference – clcto

+1

Related: [Gibt es gute Gründe für einen öffentlichen Konstruktor einer abstrakten Klasse] (http://stackoverflow.com/questions/4794305/are-there- Gute Gründe für einen öffentlichen Konstruktor einer abstrakten Klasse. – Pshemo

Antwort

8

Nein, es gibt keinen guten Grund, einen öffentlichen Konstruktor für eine abstrakte Klasse zu erstellen: Sie können Ihre abstrakte Klasse nicht instanziieren, ohne sie vorher zu untergliedern, und die Sprache behandelt die relevanten Eckfälle für Sie.

Insbesondere, wenn Sie Ihre abstrakte Klasse anonym ableiten sollen, was bedeutet, dass Sie keinen eigenen Konstruktor in der Unterklasse bereitstellen können, würde die Sprache basierend auf der Signatur des geschützten Konstruktors Ihrer abstrakten Basis eine für Sie bereitstellen Klasse:

abstract class Foo { 
    protected int x; 
    protected Foo(int x) {this.x = x;} 
    public abstract void bar(); 
} 
public static void main (String[] args) { 
    Foo foo = new Foo(123) { // <<== This works because of "compiler magic" 
     public void bar() {System.out.println("hi "+x);} 
    }; 
    foo.bar(); 
} 

im Beispiel darüber, wie der geschützten Konstruktor einer abstrakten Klasse sieht aufgerufen wird, aber das ist nicht so: die Compiler einen sichtbaren Konstruktor für Ihre anonyme Klasse bauen *, das ist das, was kommt aufgerufen, wenn Sie new Foo(123) schreiben.

Demo.

* Die tatsächliche Sichtbarkeit ist Standard. Danke, Pshemo, um den Fehler zu erkennen und eine nette test example zu liefern.

0

Es macht wirklich keinen Sinn, den Konstruktor der abstrakten Klasse öffentlich zu machen. Aber Sie können sicher sein, dass niemand Instanz direkt erstellen wird.

Verwandte Themen