搜索
您的当前位置:首页正文

设计模式-里氏替换原则

来源:榕意旅游网

里氏替换原则

里氏替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计中的一个重要原则。该原则指出:如果S是T的子类型,那么对象类型为T的实例应该能够被替换为对象类型为S的实例,而程序的行为不会发生变化。

换句话说,如果一个软件实体使用了一个父类,那么替换成子类也不会影响程序的正确性。这意味着在使用继承时,子类必须能够替换父类并对父类的方法进行扩展,而不应该破坏程序的正确性和可预期的行为。

简单来说,里氏替换原则要求子类能够替换父类并完全取代父类的功能,而不会产生意外或不一致的行为。这样可以提高代码的可复用性、灵活性和可维护性,同时也有利于降低系统的耦合度。

相关例子

(感觉看代码更容易懂~)
假设我们有一个图形类Shape,包含一个计算面积的方法CalculateArea:

public class Shape
{
    public virtual double CalculateArea()
    {
        return 0;
    }
}

然后我们定义了两个子类,分别是矩形Rectangle和正方形Square,它们继承自Shape类:

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public override double CalculateArea()
    {
        return Width * Height;
    }
}

public class Square : Shape
{
    public double SideLength { get; set; }

    public override double CalculateArea()
    {
        return SideLength * SideLength;
    }
}

在上面的例子中,矩形和正方形都是图形,都可以计算面积。根据里氏替换原则,我们可以将父类Shape的实例替换为子类Rectangle或Square的实例,并且程序的行为不会发生变化。

下面是一个使用这些类的示例:

class Program
{
    static void Main(string[] args)
    {
        Shape shape1 = new Rectangle { Width = 5, Height = 10 };
        double area1 = shape1.CalculateArea();
        Console.WriteLine("矩形的面积:" + area1);

        Shape shape2 = new Square { SideLength = 7 };
        double area2 = shape2.CalculateArea();
        Console.WriteLine("正方形的面积:" + area2);
    }
}

在这个例子中,我们分别创建了一个矩形对象和一个正方形对象,并通过调用它们的CalculateArea方法计算了它们的面积。由于矩形和正方形都是图形类的子类,所以可以将它们赋值给父类Shape的实例,并且可以正确计算出各自的面积。这符合里氏替换原则的要求。

疑问

其实看完上面的 我有点疑惑,这跟多态不是一样么? 可能还是不太了解吧 然后又去看了多态…

多态允许不同类型的对象对同一消息做出响应,从而实现了代码的灵活性和可扩展性。在C#中,多态是通过虚方法和抽象类来实现的。

与里氏替换原则相比,多态强调的是对象的行为,也就是说,不同类型的对象可以表现出不同的行为,但这些行为都是在同一个消息下完成的。而里氏替换原则强调的是对象类型的替换和使用,即子类类型可以替换父类类型并且能够完全取代父类类型的功能,从而保证程序的正确性和可预期的行为。

在C#中,多态和里氏替换原则是密切相关的,因为只有符合里氏替换原则的子类才能够正确地实现多态。如果子类不能完全替换父类的功能,那么在使用多态时可能会产生意外或不一致的行为。

(也可能只有我自己不知道 哈哈哈哈~ )

因篇幅问题不能全部显示,请点此查看更多更全内容

Top