http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 2461|回复: 4

[学习心得] C#开放-关闭里氏代换原则

[复制链接]
发表于 2018-12-20 15:14:12 | 显示全部楼层 |阅读模式
本帖最后由 惜 于 2018-12-21 10:50 编辑

一、  "开放-封闭"原则(OCP)

Open-Closed Principle 原则讲的是:一个软件实体应当对扩展开放,对修改关闭。

优点:通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和

灵活性。已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。

例子:玉帝招安美猴王

当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:"'皇帝轮流做,明年到我家。'只教他搬出去,将天宫让于
我!"对于这项挑战,太白金星给玉皇大帝提出的建议是:"降一道招安圣旨,宣上界来…,一则不劳师动众,二则
收仙有道也。"


换而言之,不劳师动众、不破坏天规便是"闭",收仙有道便是"开"。招安之道便是玉帝天庭的"开放-封闭"原则。

3X05(SU]5NQG8PUWHV3CD8P.png
招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向
对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。

二、 里氏代换原则(LSP


Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。


O[1`K(`5`J0KNYG@F`5{7F6.png
人骑马 骑白马 骑黑马。反过来的代换不成立。


《墨子·小取》说:"娣,美人也,爱娣,非爱美人也……"娣便是妹妹,哥哥喜爱妹妹,是因为两人是兄妹关系,
而不是因为妹妹是个美人。因此,喜爱妹妹不等同于喜爱美人。用面向对象语言描述,美人是基类,妹妹是美人
的子类。哥哥作为一个有"喜爱()"方法,接受妹妹作为参数。那么,这个"喜爱()"方法一般不能接受美人的实例。


FVM~ECZ03K0UVC{2IKH[UH8.png
以下代码示例:长方形和正方形
[C#] 纯文本查看 复制代码
    /// <summary>
    /// 长方形
    /// </summary>
    public class Rectangle
    {
        private int width;
        private int height;

        public virtual void setWidth(int width)
        {
            this.width = width; 
        }

        public virtual void setHeight(int height)
        {
            this.height = height;
        }

        public virtual int getWidth()
        {
            return this.width;
        }

        public virtual int getHeight()
        {
            return this.height;
        }
    }

    /// <summary>
    /// 正方形
    /// </summary>
    public class Square : Rectangle
    {
        public int Side { set; get; }

        public override void setWidth(int width)
        {
            this.Side = width;
        }

        public override void setHeight(int height)
        {
            this.Side = height;
        }

        public override int getWidth()
        {
            return this.Side;
        }

        public override int getHeight()
        {
            return this.Side;
        }
       
    }

    public class SmartTest
    {
        public void resize(Rectangle r)
        {
            while (r.getHeight() >= r.getWidth())
            {
                r.setWidth(r.getWidth() + 1); 

                Console.WriteLine(r.getWidth());
            }
            Console.ReadLine();
        }
    }

        static void Main(string[] args)
        {
            SmartTest t = new SmartTest();

            t.resize(new Square() { Side = 100 });

        }


在执行 SmartTest resize 方法时,如果传入的是长方形对象,当高度大于宽度时,会自动增加宽度直到超
出高度。但是如果传入的是正方形对象,则会陷入死循环。正方形不可以做长方形的子类。

重构类:让长方形和正方形,都继承四边形属性。形成自己独特的方法。



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2018-12-20 15:36:12 | 显示全部楼层
我只是路过打酱油的。
发表于 2018-12-20 16:32:23 | 显示全部楼层
真是难得给力的帖子啊。
发表于 2018-12-20 16:40:46 | 显示全部楼层
强烈支持楼主ing……
发表于 2018-12-24 22:16:32 | 显示全部楼层
强烈支持楼主ing……
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-5-3 15:14

© 2014-2021

快速回复 返回顶部 返回列表