Sto imparando molto su questo principio (anche grazie a due risposte che ho ricevuto qui) e vorrei approfondire su un altro punto che qualcuno ha menzionato.
1) La seguente è una violazione di LSP?
class Base
{
public virtual void UpdateUI()
{
//documented: immediately redraws UI completely
}
}
class Component: Base
{
public override UpdateUI
{
if (Time.Seconds % 10 ==0) //updates only every ten seconds
{
//drawing logic
}
}
}
A mio avviso, la descrizione del codice nella classe base rappresenta il contratto, il comportamento previsto, che viene violato nel sottotipo.
2) Perché la rottura del comportamento non ha importanza per la precondizione indebolimento?
class Human
{
public virtual void DoSomething(int age)
{
//precondition - age < 100
{
}
class Cyborg : Human
{
public virtual void DoSomething(int age)
{
//precondition - age < 200
{
}
La classe dei Cyborg ha indebolito la precondizione, che è consentita. Per argomenti validi, la sostituzione funziona bene. Ogni volta che ho un oggetto Umano, può essere usato un oggetto Cyborg. Ma cosa succede se ho un test come questo: Human (110) - deve fallire, l'argomento deve essere < 100
Quando sostituisco con Cyborg, il test passerà. Cioè il comportamento è cambiato. Perché è permesso?