2012-07-14 13 views
9

W języku Java, gdy przesłonię metodę, kompilator wyłączył próbę zawężenia widoczności jako błędu. Na przykład: nie mogę przesłonić metody publicznej jako chronionej, natomiast mogę zastąpić metodę chronioną jako publiczną.Dlaczego nie można zawęzić zakresu metody podczas przesłaniania

Interesuje mnie znajomość decyzji projektowej/myślenia stojącego za tą zasadą.

+0

To pytanie zadano kilka dni temu, ale jaki byłby sens? –

+1

http://stackoverflow.com/q/11343763/1475461 spójrz na tę dyskusję, która miała miejsce w zeszłym tygodniu w sprawie –

Odpowiedz

14

Podklasa powinna zawsze spełniać warunki umowy nadklasy. Zobacz Liskov Substitution principle.

Widoczność metod jest częścią niniejszej umowy. Zatem wszystko, co publicznie widoczne w superklasce, powinno być publiczne również w podklasie.

+1

SOLIDNA odpowiedź ....! –

14

Rozważ klasę B, która dziedziczy po A. A.m() jest publiczne. Rozważmy teraz ten kod:

A obj = new B(); 
obj.m(); 

Gdyby to wezwanie być dozwolone? Tak, powinien, ponieważ obj jest obiektem typu A! Jest to również obiekt typu B, ale niekoniecznie jest znany temu, który używa obiektu.

Każdy obiekt typu A musi być zgodny z umową (interfejsem) dla A. B rozszerza A i dlatego musi również przestrzegać tej umowy.

3

Podczas usuwania lub wdrażania poziomu dostępu, powinniśmy przejść do tego samego poziomu dostępu lub do tego poziomu dostępu.

private < (default) < protected < public 

Opinia publiczna jest szersza na najwyższym poziomie.

W interfejsie wszyscy członkowie są domyślnie dostępni publicznie. Tak więc, podczas implementacji lub przeskakiwania, musimy wybierać tylko publicznie.

Powiązane problemy