Nie, nie ma żadnego powodu, aby utworzyć publicznego konstruktora dla klasy abstrakcyjnej: nie można utworzyć instancji klasy abstrakcyjnej bez jej wcześniejszej podklasy, a język zajmuje się odpowiednimi przypadkami narożnymi.
W szczególności, jeśli masz zamiar podklasować swoją klasę abstrakcyjną anonimowo, co oznacza, że nie możesz podać własnego konstruktora w podklasie, język zapewniłby go dla ciebie na podstawie podpisu chronionego konstruktora twojej abstrakcyjnej bazy klasa:
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();
}
W powyższym przykładzie wygląda jak chronionego konstruktora klasy abstrakcyjnej jest wywoływany, ale tak nie jest: kompilator tworzy widoczną konstruktora dla anonimowego klasy *, czyli co robi wywoływane podczas pisania new Foo(123)
.
Demo.
* Rzeczywista widoczność jest domyślny. Dzięki, Pshemo, za wykrycie błędu i dostarczenie miłego test example.
Odpowiedź zależy od potrzeb klasy. Możesz mieć więcej niż jedną implementację 'Abstract' klasy, która zapewnia podstawową konfigurację, ale wymaga jednej lub więcej metod do zaimplementowania przez konkretną klasę. Można to zrobić, aby zmniejszyć liczbę powtórzeń, które mogą być potrzebne do wdrożenia podstawowej klasy abstrakcyjnej, na przykład ... – MadProgrammer
Powiązane (dla C#): http://stackoverflow.com/questions/4532233/protected-vs-public -konstruktor-do-abstrakcyjnej-klasy-jest-istnieje-różnica – clcto
Powiązane: [Czy istnieją dobre powody dla publicznego konstruktora klasy abstrakcyjnej] (http://stackoverflow.com/questions/4794305/are-there- powody, dla których warto konstruować publiczną klasę konstruktora) – Pshemo