2009-10-21 8 views

risposta

65

Perché ogni istanza della sottoclasse deve ancora essere un'istanza valida della classe di base (vedi Liskov substitution principle).

Se la sottoclasse improvvisamente ha perso una proprietà della classe base (vale a dire un metodo pubblico per esempio), allora sarebbe più un valido sostituto per la classe di base.

+2

Ma perché siamo non posso accedere a sovrascrivere un metodo protetto e modificarlo a privati? Poiché l'interfaccia pubblica è sempre la stessa, non interrompe LSP in questo modo. – Pacerier

+0

L'interfaccia pubblica non cambia, ma la protetta lo fa. Il codice nella classe genitore non può accedere ai metodi della propria carne e sangue :( – Elazar

1

Perché sottotipi devono essere utilizzabile come esempi di loro supertipo.

18

Perché se questo è stato permesso, la seguente situazione sarebbe possibile:

Class Sub eredita dalla classe padre. Il genitore ha un metodo pubblico foo, Sub lo rende privato. Ora il seguente codice compilato bene, perché il tipo dichiarato di bar è genitore:

Parent bar = new Sub(); 
bar.foo(); 

Tuttavia non è chiaro come questo si deve comportare. Una possibilità sarebbe lasciare che causi un errore di runtime. Un altro sarebbe semplicemente permetterlo, il che renderebbe possibile chiamare un metodo privato dall'esterno, semplicemente lanciando la classe genitore. Nessuna di queste alternative è accettabile, quindi non è consentita.

Problemi correlati