oleg ha scritto:
Ma con questa modellazione, non viene violato il principio di sostituzione di Liskov?
Questo principio lo devi garantire tu sapendo cosa rappresentano e fanno le classi in relazione tra di loro. Il compilatore è solo in grado di fare i controlli tecnici sulle dichiarazioni dei metodi. Le regole di Java per cui un metodo che fa l'
override non può restringere il livello di accesso e non può dichiarare eccezioni checked "nuove" oppure più "ampie" (rispetto al metodo sovrascritto), servono proprio a garantire il principio di sostituibilità a livello puramente tecnico. Ma a livello concettuale sui comportamenti dei metodi lo devi assicurare tu.
Un classico esempio di violazione è una classe Punto3D che estende Punto2D. Se fai questo, compila benissimo e funziona pure. Puoi anche mettere in Punto2D un metodo es.
double distanzaDa(Punto2D p). E siccome Punto3D estende Punto2D, tecnicamente puoi fare:
double dist = pa2d.distanzaDa(pb3d);
compila benissimo e funziona (distanzaDa userà solo x/y del Punto3D se non "sa" nulla di più specifico). Ma .... NON ha senso. Queste cose le devi impedire tu ...
non facendole ... (non facendo questa estensione)