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.
- 1. insidie di utilizzo Classe rottura Liskov principio di sostituzione
- 2. Liskov principio di sostituzione - metodo prioritario esempio
- 3. Non può indebolire precondizioni e rafforzando postcondizioni violano anche Liskov principio di sostituzione?
- 4. C# è l'interfaccia lanciare una violazione del principio di sostituzione di liskov
- 5. Come simulare il metodo protetto di sottoclasse ereditato dalla classe astratta?
- 6. Quando la sostituzione di Liskov si riferisce ai sottotipi, si tratta di classi derivate nel contesto di C#?
- 7. astratta classe derivata dalla classe concreta
- 8. Rendere questa classe sia conforme al principio di inversione di dipendenza
- 9. Si tratta di un esempio del principio di responsabilità unica?
- 10. Aggiungi annotazione al campo ereditato
- 11. Classi case ereditate dalla classe astratta
- 12. Matrice di classe astratta
- 13. Chiamare il costruttore della sottoclasse dalla classe astratta in Java
- 14. datepicker si applica al campo errato
- 15. Come estendere la classe enum dalla classe astratta?
- 16. Derive classe astratta da classe non astratta
- 17. istanza di una classe astratta
- 18. miscelazione ereditato costruttore dalla classe base con un construcutor personalizzato
- 19. Serializzazione di una classe astratta
- 20. Come il principio di singola responsabilità si riferisce al modello di dominio anemico/ricco?
- 21. MVC 3 Modello che associa un sottotipo (Classe astratta o interfaccia)
- 22. Prendi il repository di un entità di destinazione dalla classe astratta in Dottrina 2.5
- 23. relazione ForeignKey di classe astratta
- 24. Il gruppo di Pandas si applica lentamente
- 25. Perché il membro ereditato non è consentito?
- 26. Il comportamento non definito si applica al codice asm?
- 27. Come impedire il completamento di bash dalla sostituzione di un carattere al termine del tab
- 28. Questo rompe il mio principio SOLIDO?
- 29. Perché non posso derivare dalla classe astratta System.Enum?
- 30. Interfaccia/standard di codifica di classe astratta