我听说Liskov替换原则(LSP)是面向对象设计的基本原则.它是什么以及它的使用例子是什么?
oop liskov-substitution-principle definition design-principles solid-principles
我已经阅读了很多这方面的文章,但我还有两个问题.
问题#1 - 关于依赖性倒置:
它声明高级类不应该依赖于低级类.两者都应该取决于抽象.抽象不应该依赖于细节.细节应取决于抽象.
例如 :
public class BirthdayCalculator
{
    private readonly List<Birthday> _birthdays;
    public BirthdayCalculator()
    {
        _birthdays = new List<Birthday>();// <----- here is a dependency
    }
...
修复:把它放在一个ctor.
public class BirthdayCalculator
{
    private readonly IList<Birthday> _birthdays;
    public BirthdayCalculator(IList<Birthday> birthdays) 
    {
        _birthdays = birthdays;
    }
如果它将在ctor中 - 我将不得不每次使用该课程时发送它.所以在打电话给BirthdayCalculator班级时我必须保留它.它可以这样做吗?
我可以争辩说,在修复之后,仍然 - IList<Birthday> _birthdays不应该在那里(Birthdayin IList) - 但它应该是IList<IBirthday>.我对吗 ?
问题#2 - 关于利斯科夫换人:
派生类必须可替代其基类
或更准确:
设q(x)是关于类型T的对象x可证明的属性.对于类型S的对象y,q(y)应该为真,其中S是T的子类型.
(已经读过这个)
例如:
public …c# design-patterns liskov-substitution-principle inversion-of-control solid-principles