Diciamo che abbiamo questa classe base:
class MyBase
{
public string Name { get; set; }
public string GetDescription()
{
var descriptionList = new List<string>() { this.Name };
descriptionList.AddRange(this.ExtraDescriptions.ToList());
return string.Join(", ", descriptionList();
}
protected virtual IEnumerable<string> ExtraDescriptions()
{
return new List<string>();
}
}
Quindi aggiungi una classe derivata:
class MyDerived : MyBase
{
protected override IEnumerable<string> ExtraDescriptions()
{
return new List<string>() { "a", "b" };
}
}
Mi sembra che questo violi il LSP (perché stiamo cambiando il comportamento del metodo GetDescription
), eppure è anche una caratteristica fondamentale della programmazione orientata agli oggetti. La classe base ovviamente dichiara la sua intenzione di consentire l'override del metodo ExtraDescriptions
, ma questo non è necessariamente visibile a un consumatore della classe.
Da quando ho saputo della LSP, questo problema mi ha davvero tormentato. Quindi:
- Questo viola l'LSP?
- Qual è l'alternativa corretta a questo?