温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#里氏替换原则怎么实现

发布时间:2022-03-03 09:05:34 来源:亿速云 阅读:131 作者:iii 栏目:开发技术

本文小编为大家详细介绍“C#里氏替换原则怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“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#里氏替换原则怎么实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI