C#面向对象设计原则之里氏替换原则

 更新时间:2022年03月07日 10:58:03   作者:.NET开发菜鸟  
这篇文章介绍了C#面向对象设计原则之里氏替换原则,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

里氏替换原则(LSP)

定义:在任何父类出现的地方都可以用它的子类类替换,且不影响功能。
解释说明:
其实LSP是对开闭原则的一个扩展,在OO思想中,我们知道对象是由一系列的状态和行为组成的,里氏替换原则说的就是在一个继承体系中,对象应该具有共同的外在特性,使用LSP时,如果想让我们的程序达到一个父类出现的地方都可以用它的子类来替换且不影响功能,那么这个父类也应该尽量声明出子类所需要的一些公共的方法,父类被子类替换之后,会比较顺利,那么为什么说它是对开闭原则的一个扩展呢?因为我们在开闭原则中说尽量使用接口和抽象类,当然这个抽象类和接口也应该尽量定义得完整,这样我们这个接口和抽象类会比较稳定,这样既符合了开闭原则也满足了里氏替换原则。

错误案例1:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 里氏替换原则
{
    /// <summary>
    /// 鸟类
    /// </summary>
    public class Bird
    {
        /// <summary>
        /// 吃的方法
        /// </summary>
        public void Eat()
        { }

        /// <summary>
        /// 飞的方法
        /// </summary>
        public void Fly()
        { }
    }

    /// <summary>
    /// 定义一个企鹅类继承鸟类
    /// </summary>
    public class Penguin : Bird
    {

    }

    public class Test
    {
        public static void ShowFly(Bird bird)
        {
            bird.Fly();
        }

        public static void Main()
        {
            ShowFly(new Penguin());
        }
    }
}

解释说明:

在上面的代码中,定义了一个鸟类,企鹅类继承自鸟类。鸟类里面有飞的方法,而企鹅不会飞,所以上面的代码违反了里氏替换原则。

错误案例2:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 里氏替换原则
{
    /// <summary>
    /// 定义一个父类宠物类
    /// </summary>
    public  class Pet
    {
    }

    /// <summary>
    /// 定义一个企鹅类继承自宠物类
    /// </summary>
    public class PenguinDemo : Pet
    {
        /// <summary>
        /// 游泳的方法
        /// </summary>
        public void Swiming()
        {
            Console.WriteLine("可爱企鹅在游泳");
        }
    }

    /// <summary>
    /// 定义一个海豚类继承自宠物类
    /// </summary>
    public class Dolphin : Pet
    {
        /// <summary>
        /// 玩游戏的方法
        /// </summary>
        public void PlayGame()
        {
            Console.WriteLine("神奇泡泡打砖块");
        }
    }

    /// <summary>
    /// 测试类
    /// </summary>
    public class Test
    {
        public static void ShowPlay(Pet pet)
        {
            if (pet is PenguinDemo)
            {
                //类型转换
                PenguinDemo pen = (PenguinDemo)pet;
                pen.Swiming();
            }
            if (pet is Dolphin)
            {
                //类型转换
                Dolphin dol = (Dolphin)pet;
                dol.PlayGame();
            }
        }
    }
}

解释说明:

如果把河豚、企鹅当做宠物,我们可以定义一个宠物类,然后,让这些宠物继承这个类,我们知道每种宠物我们跟他玩耍的方式是不一样的。比如。企鹅有游泳的方法,河豚有游戏的方法,根据这个需求,我们设计一个系统,编写一个宠物类,让企鹅继承这个宠物类,在企鹅类里创建一个游泳的方法,这个方法不能放到宠物类里面,因为并不是所有宠物都会游泳。编写河豚类时,同样让他继承宠物类,在河豚类里面编写一个游戏的方法,这个时候客户端程序在使用宠物类和它的子类的时候,就需要做判断,具体是哪个子类,我们通过宠物类是无法调用具体的方法,要做一个判断和转型,如果在加一个狗类,狗类也会有一个独立的方法,要修改之前的代码(使用宠物类和它的子类的时候,要增加判断是狗类),这很明显不符合开闭原则,也不可能符合里氏替换原则,因为这里面的任何一个宠物都无法替换他的父类,因为他们的行为是不一样的,代码的可维护性和重用性很差!

代码下载链接:点此下载

到此这篇关于C#面向对象设计原则之里氏替换原则的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#用RabbitMQ实现消息订阅与发布

    C#用RabbitMQ实现消息订阅与发布

    在消息队列模型中,如何将消息广播到所有的消费者,这种模式成为“发布/订阅”。本文主要以一个简单的小例子,简述通过fanout交换机,实现消息的发布与订阅,仅供学习分享使用,如有不足之处,还请指正。
    2021-05-05
  • C#绘制曲线图的方法

    C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • 读写XML文件的内容并将其显示在ListView控件上的方法

    读写XML文件的内容并将其显示在ListView控件上的方法

    下面小编就为大家带来一篇读写XML文件的内容并将其显示在ListView控件上的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C# WinForm实现鼠标穿透功能

    C# WinForm实现鼠标穿透功能

    在WinForm开发时,会用到这样一个场景,给屏幕增加水印Logo,但不影响画面的操作,这里就会用到鼠标穿透功能,下面我们就来学习一下鼠标穿透功能的具体实现吧
    2023-11-11
  • C#实现绘制面形图表的方法详解

    C#实现绘制面形图表的方法详解

    这篇文章主要介绍了C#实现绘制面形图表的方法,对于C#初学者很好的掌握C#图形绘制有一定的借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C#实现策略模式

    C#实现策略模式

    这篇文章介绍了C#实现策略模式的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#中事件的继承实例分析

    C#中事件的继承实例分析

    这篇文章主要介绍了C#中事件的继承,通过一个面向对象程序实例来说明子类调用父类事件的实现方法,需要的朋友可以参考下
    2014-08-08
  • C#汉字转拼音实例(支持多音字)

    C#汉字转拼音实例(支持多音字)

    几年前就在网上看到过汉字转拼音的程序,大都就是按汉字的编码转换,单字对应的算法实现的。但是都有一个共同的缺点,不能支持多音字。本篇文章主要介绍了C#汉字转拼音实例(支持多音字),有兴趣的可以了解一下。
    2016-12-12
  • c#反射调用方法示例

    c#反射调用方法示例

    这篇文章主要介绍了c#反射调用方法示例,需要的朋友可以参考下
    2014-04-04
  • C#检测两个矩阵是否相等的方法

    C#检测两个矩阵是否相等的方法

    这篇文章主要介绍了C#检测两个矩阵是否相等的方法,涉及C#进行数组操作的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论