Yth*_*Csi 6 c# liskov-substitution-principle covariance solid-principles
我正在尝试理解协方差和LSP.从这个问题我可以看出C#不支持返回类型协方差.然而Liskov替换原则对返回类型强加协方差.
这是否意味着在C#中应用这个原则是不可能的?还是我想念一些东西?
C#仍然可以应用Liskov替换原则.
考虑:
public class Base1
{
}
public class Derived1 : Base1
{
}
public class Base2
{
public virtual Base1 Method()
{
return new Base1();
}
}
public class Derived2 : Base2
{
public override Base1 Method()
{
return new Derived1();
}
}
Run Code Online (Sandbox Code Playgroud)
如果C#支持协变返回类型,那么可以声明Method()in 的覆盖Base2:
public class Derived2 : Base2
{
public override Derived1 Method()
{
return new Derived1();
}
}
Run Code Online (Sandbox Code Playgroud)
C#不允许这样做,你必须声明返回类型与它在基类中的相同,即Base1.
但是,这样做并不违反Liskov替代原则.
考虑一下:
Base2 test = new Base2();
Base1 item = test.Method();
Run Code Online (Sandbox Code Playgroud)
相比:
Base2 test = new Derived2();
Base1 item = test.Method();
Run Code Online (Sandbox Code Playgroud)
我们完全能够替代new Base2()与new Derived2()没有问题.这符合Liskov替代原则.
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |