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#实现简单屏幕监控的方法

    C#实现简单屏幕监控的方法

    这篇文章主要介绍了C#实现简单屏幕监控的方法,涉及C#的图标隐藏及屏幕截图等技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#中GraphicsPath的AddString方法用法实例

    C#中GraphicsPath的AddString方法用法实例

    这篇文章主要介绍了C#中GraphicsPath的AddString方法用法,实例分析了AddString方法添加字符串的相关使用技巧,需要的朋友可以参考下
    2015-06-06
  • C# 中使用正则表达式匹配字符的含义

    C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-10-10
  • C#多线程与异步的区别详解

    C#多线程与异步的区别详解

    多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至有些时候我们就认为多线程和异步操作是等同的概念。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别
    2017-06-06
  • C#中的矩形数组(多维数组)和锯齿数组的实现

    C#中的矩形数组(多维数组)和锯齿数组的实现

    本文主要介绍了C#中的矩形数组(多维数组)和锯齿数组的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C#通过流写入一行数据到文件的方法

    C#通过流写入一行数据到文件的方法

    这篇文章主要介绍了C#通过流写入一行数据到文件的方法,涉及C#针对文本文件读写的基本技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Unity3D自定义创建圆锥体

    Unity3D自定义创建圆锥体

    这篇文章主要为大家详细介绍了Unity3D自定义创建圆锥体,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C# winForm自定义弹出页面效果

    C# winForm自定义弹出页面效果

    这篇文章主要为大家详细介绍了C# winForm自定义弹出页面效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#/VB.NET实现在PDF文档中插入,替换或删除图片

    C#/VB.NET实现在PDF文档中插入,替换或删除图片

    这篇文章主要为大家详细介绍了如何使用 Spire.PDF for .NET 通过程序在 PDF 文档中插入、替换或删除图片,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C#实现windows form倒计时的方法

    C#实现windows form倒计时的方法

    这篇文章主要介绍了C#实现windows form倒计时的方法,涉及C#桌面程序设计中时间操作的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论