2010-10-17 34 views
39

Załóżmy, że mamy następujący kod:rozciąga klasy z prywatnych konstruktora

class Test { 
    private Test() { 
     System.out.println("test"); 
    } 

} 

public class One extends Test { 

    One() { 
     System.out.println("One"); 
    } 

    public static void main(String args[]) { 

     new One(); 
    } 
} 

Kiedy utworzyć obiekt One, który został pierwotnie nazwał konstruktora klasy nadrzędnej Test(). ale jako Test() było prywatne - otrzymujemy błąd. Ile wynosi dobry przykład i wyjście z tej sytuacji?

Odpowiedz

39

Nie ma wyjścia. Musisz utworzyć dostępny super-konstruktor (protected, public lub domyślny), aby móc przedłużyć test.

Ten rodzaj notacji jest zwykle używany w klasach użytkowych lub w singletonach, w których nie chcesz, aby użytkownik sam stworzył instancję klasy, rozszerzając ją i inicjując podklasę lub po prostu wywołując konstruktora Twoja klasa.

Kiedy masz class tylko private konstruktorów, można także zmienić class do final, ponieważ nie może być rozszerzony na wszystkich.


Innym rozwiązaniem będzie o metodę w test które tworzą wystąpienia test i przenieść wszystkie połączenia metodę z One na przykład test. W ten sposób nie trzeba przedłużać test.

class Test { 
    private Test() { 
     System.out.println("test"); 
    } 
    public static Test getInstance(){ 
     return new Test(); 
    } 
    public void methodA(){ 
     //Some kind of implementation 
    } 
} 

public class One { 
    private final Test test; 
    One() { 
     System.out.println("One"); 
     test = Test.getInstance(); 
    } 

    public void methodA(){ 
     test.methodA(); 
    } 

    public static void main(String args[]) { 
     new One(); 
    } 
} 
+4

Metoda 'getInstance()' klasy 'Test' powinna być statyczna. W przeciwnym razie nie można nawiązać połączenia typu 'Test.getInstance()'. – vanje

+0

@vanje, dzięki, zaktualizowano –

1

Bądź konstruktora test nie- private lub przenieść One w test.

BTW Twój przykładowy kod zawiera kilka kwestii:

  • Klasy powinny być nazywane tytuł przypadek (Test zamiast test)
  • Sugeruję, aby konstruktora One „s private chyba że jest wywołany z innej klasy w tym samym pakiecie
+0

Jeśli nie masz kodu źródłowego testu? – powder366

0

Właściwie to znalazłem wyjście. W ten sposób:

class Base { 
private Base() { 

} 

public void fn() { 
    System.out.println("Base"); 
} 

public static class Child extends Base { 
    public void fn() { 
     System.out.println("Child"); 
    } 
} 

public static Base getChild() { 
    return new Child(); 
}} 

Teraz możesz użyć metody getChild(), aby uzyskać wystąpienie rozszerzonej klasy.

+5

Działa to tylko podczas umieszczania statycznej klasy wewnętrznej, ponieważ prywatne metody są dostępne dla klas wewnętrznych. Niestety to nie pomaga, ponieważ jeśli jesteś w stanie zmienić klasę, lepiej jest ci służyć, ustawiając najpierw konstruktora na chroniony lub publiczny. –

Powiązane problemy