2014-10-27 11 views
6

Ponieważ klasa abstrakcyjna nie może być instancja, a od chronione członkowie są zawsze widoczne na podklasy, wydaje się, że nie ma różnicy, czy jego konstruktorzy publicznego lub chroniony.Czy istnieje jakiś element klasy abstrakcyjnej z publicznym konstruktorem zamiast chronionym?

Czy istnieje przykład, w którym publiczny konstruktor może coś zmienić w porównaniu z chronionym? Normalnie wolałbym najbardziej restrykcyjny poziom dostępu, który ma zastosowanie.

+1

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

+1

Powiązane (dla C#): http://stackoverflow.com/questions/4532233/protected-vs-public -konstruktor-do-abstrakcyjnej-klasy-jest-istnieje-różnica – clcto

+1

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

Odpowiedz

8

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.

0

Naprawdę nie ma sensu, aby konstruktor klasy abstrakcyjnej był publiczny. Ale możesz być pewien, że nikt nie stworzy instancji bezpośrednio.

Powiązane problemy