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#结合JavaScript实现秒杀倒计时的方法

    C#结合JavaScript实现秒杀倒计时的方法

    这篇文章主要介绍了C#结合JavaScript实现秒杀倒计时的方法,涉及C#结合javascript操作时间的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • c#互斥锁Mutex类用法介绍

    c#互斥锁Mutex类用法介绍

    本文详细讲解了c#互斥锁Mutex类的用法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C# FileStream简单介绍和使用

    C# FileStream简单介绍和使用

    这篇文章主要为大家详细介绍了C# FileStream基本功能和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 如何在UpdatePanel中调用JS客户端脚本

    如何在UpdatePanel中调用JS客户端脚本

    本文将介绍如何在UpdatePanel中调用JS客户端脚本,需要了解的朋友可以参考下
    2012-12-12
  • C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

    C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法

    某论坛的评论区模块,发现这功能很不错,琢磨了一晚上做了大致一样的,用来当做 注册模块 的头像绑定功能,下面通过实例代码给大家介绍下C# 获取指定QQ头像绘制圆形头像框GDI(Graphics)的方法,感兴趣的朋友一起看看吧
    2021-11-11
  • C#中WPF依赖属性的正确学习方法

    C#中WPF依赖属性的正确学习方法

    这篇文章主要介绍了C#中WPF依赖属性的正确学习方法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • C#设置页面单位和缩放的方法

    C#设置页面单位和缩放的方法

    这篇文章主要介绍了C#设置页面单位和缩放的方法,涉及C#设置页面属性的相关技巧,需要的朋友可以参考下
    2015-06-06
  • Unity实现VR中在黑板上写字效果

    Unity实现VR中在黑板上写字效果

    这篇文章主要为大家详细介绍了Unity实现VR中在黑板上写字效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • C# 实现基于ADO.NET框架的DBHelper工具类(简化数据库操作)

    C# 实现基于ADO.NET框架的DBHelper工具类(简化数据库操作)

    ADO.NET是.NET框架中用于与数据库交互的核心组件,提供了一套用于连接数据库、执行SQL查询、插入、更新和删除数据的类库,包括SqlConnection、SqlCommand、SqlDataReader等,本文介绍如何使用DBHelper类封装数据库操作,以提高代码的可维护性和复用性,感兴趣的朋友一起看看吧
    2024-08-08
  • C# Access数据库增删查改的简单方法

    C# Access数据库增删查改的简单方法

    这篇文章主要介绍了C# Access数据库增删查改的简单方法,有需要的朋友可以参考一下
    2014-01-01

最新评论