当Liskov替换提到子类型时,它是在C#的上下文中谈论派生类吗?

当Liskov替换提到子类型时,它是在C#的上下文中谈论派生类吗?,c#,oop,solid-principles,C#,Oop,Solid Principles,看了这本书后,我对“subtype”这个词不太熟悉 我采用Liskov替代法的意思是,如果你有一种方法,可以使用动物,你应该能够通过猫或动物,其中猫:动物,而不会产生任何意外的副作用 这就是Liskov替换所指的吗?是的。Likov的替换原理指出,如果程序模块使用基类,那么对基类的引用可以替换为派生类,而不会影响程序模块的功能。任何携带动物的动物都应该能够携带一只狗、一只猫和一个亚类(品种,如果你喜欢的话)。这些方法将是兼容的 还要注意,子类型中的先决条件不能加强,后决条件也不能削弱。否则,您可

看了这本书后,我对“subtype”这个词不太熟悉

我采用Liskov替代法的意思是,如果你有一种方法,可以使用
动物
,你应该能够通过
动物
,其中
猫:动物
,而不会产生任何意外的副作用


这就是Liskov替换所指的吗?

是的。Likov的替换原理指出,如果程序模块使用基类,那么对基类的引用可以替换为派生类,而不会影响程序模块的功能。任何携带动物的动物都应该能够携带一只狗、一只猫和一个亚类(品种,如果你喜欢的话)。这些方法将是兼容的


还要注意,子类型中的先决条件不能加强,后决条件也不能削弱。否则,您可能会插入一个特定的子类型,而这将中断,因为周围的代码强加了子类无法容忍的某些先决条件。这在实践中可能很难实现-有关更多信息,请参阅。

基本上是的。当然,通常会有可区分的差异,否则我们不会为不同的子类而烦恼——但只要它们都遵守接口/基类的约定,这就是客户机所依赖的全部,它就应该都能工作。(我觉得这太基本了,无法作为答案添加。)为什么投票以“不具建设性”来结束这个问题?谢谢,我不确定这是否是指可以使用int/double等类型来替代彼此的方式。如果你把它放在答案框里,我可以把它标记为答案。对我来说,这是一个非常合理的问题,前后条件都是+1。因为这就是在强类型语言的上下文中谈论Liskov的全部内容。现在读它看起来很有趣。我想知道你到底是怎么违反这个原则的,因为c是强类型的,你不能访问任何错误地不存在的属性。所以你会说Liskov原则在这种情况下被打破了,因为圆不是椭圆的一种类型吗?这可以通过
stretchX
圆上不是有效的操作来证明?