C#返回类型协方差和Liskov替换原则

Yth*_*Csi 6 c# liskov-substitution-principle covariance solid-principles

我正在尝试理解协方差和LSP.从这个问题我可以看出C#不支持返回类型协方差.然而Liskov替换原则对返回类型强加协方差.

这是否意味着在C#中应用这个原则是不可能的?还是我想念一些东西?

Mat*_*son 5

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替代原则.