in senso lato, Principio di sostituzione di Liskov afferma che una classe derivata può essere sostituita al posto della classe base senza influenzare l'utente. Nel caso in cui la classe base sia una classe astratta, il che significa che nessun utente sta usando un'istanza della classe base, le restrizioni di ereditarietà di Liskov si applicano ancora alla classe derivata?Il principio di sostituzione di Liskov si applica al sottotipo ereditato dalla classe astratta?
risposta
Solo perché non è possibile creare un'istanza di una classe particolare, non significa che non è possibile utilizzarlo. In questo scenario, il codice chiamante utilizza la classe base astratta come definizione del contratto in base al quale opera. In questo senso, ogni classe che deriva dalla classe base dovrebbe essere intercambiabile rispetto all'interfaccia definita dalla classe base, quindi sì, Liskov si applica ancora. In effetti, questo è uno dei motivi principali per cui si vorrebbe avere una classe base astratta per un insieme di classi che hanno un comportamento comune - quindi è possibile definire le operazioni in termini dell'interfaccia di classe base e non preoccuparsi di quale classe derivata quella in realtà stai operando.
Sì, perché un chiamante può sempre fare questo:
BaseAbstractClass instance = new DerivedClass();
Le classi astratte non sono affatto in conflitto con LSP. Molte persone considerano l'utilizzo di "nuovo" direttamente dal codice client per essere una violazione dello spirito di LSP. Se entrambi istanziate e utilizzate un oggetto, siete strettamente vincolati a tale implementazione e non potete assolutamente "sostituirlo".
Considerare di avere l'oggetto creato tramite una factory o passato come argomento o tramite dependency injection dopo essere stato creato da qualche tipo di repository che può essere focalizzato a prendere decisioni su quali tipi concreti sono necessari in varie circostanze.
In breve, sì. L'LSP si applica essenzialmente allo all'eredità pubblica. Il fatto che una classe base sia astratta non lo cambia. La classe base definisce un'interfaccia e tutti i derivati legittimi devono soddisfare tutti i requisiti di tale interfaccia.
Sì.
Vedere la sezione "Un esempio reale" (pagina 7-8) di Uncle Bob's The Liskov Substitution Principle article.