2010-10-11 11 views
10

Mam klasę "ClassA", która ma prywatnego konstruktora.Jak rozwiązać problem 'Niejawny super konstruktor klasyA() nie jest widoczny. Musi jawnie wywołać inny konstruktor "?

public final class ClassA{ 
    private ClassA{ 
    } 

    public static void main(String[] arg) }{ 
    ; 
    ; 
    ; 
    } 
} 

Teraz jestem rozszerzenie klasy 'ClassA' [końcowy Hasło zostanie usunięty przed wykonaniem tej]

public class ClassB extends ClassA{ 
    public static void main(String[] arg) }{ 
     ; 
     ; 
     ; 
     } 

} 

Teraz jestem coraz Implicit super constructor classA() is not visible. Must explicitly invoke another constructor. Co to znaczy i jak rozwiązać ten problem?

Uwaga Nie można zmienić specyfikatora dostępu dla konstruktora ClassA.

+1

I myślę, że zauważyłeś, że nie możesz zmienić dostępu dla konstruktora ClassA ... – Bivas

+0

@Bivas: tak, ale nikt nie odpowiada na inne niż zmiana prywatnych na publiczne/chronione –

+1

Zrobiłem (rozwiązanie kompozycji) :-) – Bivas

Odpowiedz

6

Zmiana widoczności klasy konstruktora ClassA z private na protected.

Konstruktory rozpoczynają się zawsze od wywołania konstruktora nadklasy. Jeśli konstruktor jawnie zawiera wywołanie konstruktora nadklasy, ten konstruktor jest używany. W przeciwnym razie implikowany jest konstruktor bez parametrów. Jeśli konstruktor bezargumentowy nie istnieje lub nie jest widoczny dla podklasy, pojawia się błąd podczas kompilacji.

+0

Ponieważ wszystkie odpowiedzi dotyczą zmiany specyfikatora dostępu, akceptuję ten, który pojawił się jako pierwszy. :) –

2

Zmiana private ClassA{} na protected ClassA{} brzmi jak dobre rozwiązanie.

Konstruktor nadrzędny jest zawsze wywoływany w klasie potomnej: niejawnie lub nie. Więc twoja definicja ClassB jest równoważna

public ClassB extends ClassA { 
    public ClassB() { 
     super(); 
    } 

    // all other methods you have go here... 
} 

Jeśli tylko konstruktor ClassA jest prywatny, nie może być wywoływana z ClassB.

2

Java domyślnie utworzy konstruktor bez parametrów dla klasy B, która wywoła funkcję super(). W twoim przypadku konstruktor w ClassA nie jest widoczny, stąd błąd, który otrzymujesz. Zmiana widoczności na publiczną lub chronioną spowoduje usunięcie błędu.

+1

i nie można zmienić konstruktora na publiczny –

7

Proponuję skład zamiast dziedziczenia (może to właśnie projektant ClassA przeznaczone do użytku klasowego. Przykład:.

 
public class ClassB { 
    private ClassA classA; 

    ClassB() { 
     // init classA 
     ... 
    } 

    public ClassA asClassA() { 
     return classA; 
    } 

    // other methods and members for ClassB extension 
} 

można delegować metody z ClassB do ClassA lub zastąpić je

Powiązane problemy