昨天晚上看了《舌尖上的中国2》第一集,特别的感人,尤其是看到帮别人割麦子的麦客,一亩地开价200,雇主只肯给100,脸上的那种纠结和无可奈何。还有长着大眼睛的跳跳鱼,很可爱,不过最终还是被水煮了,有点残忍,这也是自然的规律,个人感觉如果没到揭不开锅的地步的话,就少吃点这种可爱的生灵,你怎么对自然,自然也会怎么对你。

一、常规写法

言归正传,还是说到程序上,以前看了很多多态和开闭原则的理论,但一直不知道怎么用,或者说脑子里很糊涂,现在用美食帮助理解这两个点,如果我要根据菜名来显示配方,代码可能会这样写:

 class Program
       {
             static void Main(string[] args)
             {
                   Food f1 = Food.跳跳鱼红菇汤;
                   ShowMaterial(f1);

                   Food f2 = Food.歧山臊子面;
                   ShowMaterial(f2);

                   Food f3 = Food.四川泡菜;
                   ShowMaterial(f3);

                   Console.ReadLine();
             }

             static void ShowMaterial(Food food)
             {
                   switch (food)
                   {
                          case Food.跳跳鱼红菇汤:
                                Console.WriteLine(string .Format("{0}食材:跳跳鱼、盐、豆腐、红菇。" , Food.跳跳鱼红菇汤.ToString()));
                                break;
                          case Food.歧山臊子面:
                                Console.WriteLine(string .Format("{0}食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。" , Food.歧山臊子面.ToString()));
                                break;
                          case Food .四川泡菜:
                                Console.WriteLine(string .Format("{0}食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。" , Food.四川泡菜.ToString()));
                                break;
                   }
             }

             enum Food
             {
                   跳跳鱼红菇汤,
                   歧山臊子面,
                   四川泡菜
             }
       }

运行后屏幕显示:

跳跳鱼红菇汤食材:跳跳鱼、盐、豆腐、红菇。
歧山臊子面食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。
四川泡菜食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。

二、多态写法

现在这个程序也能跑起来了,不过如果我要添加“山东大煎饼”,就要修改Food枚举,还要在ShowMaterial方法再加个Switch分支,这里就违反了开闭(对扩展开放、对修改关闭)原则,好的设计应该是在不修改原来的代码上扩展新功能,用多态和开闭原则实现的新代码如下:

 class Program
       {
             static void Main(string[] args)
             {
                   Food f1 = new TiaoTiaoFish();//跳跳鱼
                   f1.ShowMaterial();

                   Food f2 = new SiChuanPaoCai();//泡菜
                   f2.ShowMaterial();

                   ShanDongBin bin = new ShanDongBin();//煎饼
                   bin.ShowMaterial();

                   Console.ReadLine();
             }
       }

       abstract class Food
       {
              /// <summary>
              /// 食物名称
              /// </summary>
              public string Name { get; set; }

              /// <summary>
              /// 显示食材的方法
              /// </summary>
              public abstract void ShowMaterial();
       }

       class TiaoTiaoFish : Food
       {
             public TiaoTiaoFish()
                   : base()
             {
                   Name = "跳跳鱼红菇汤" ;
             }

             public override void ShowMaterial()
             {
                    Console.WriteLine(string .Format("{0}食材:跳跳鱼、盐、豆腐、红菇。" , Name));
             }
       }

       class QiShanNoodle : Food
       {
             public QiShanNoodle()
                   : base()
             {
                   Name = "歧山臊子面" ;
             }
             public override void ShowMaterial()
             {
                    Console.WriteLine(string .Format("{0}食材:五花肉、面、葱、姜、干辣椒面、五香粉、十三香、盐、鸡蛋、蒜苗。" , Name));
             }
       }

       class SiChuanPaoCai : Food
       {
             public SiChuanPaoCai()
                   : base()
             {
                   Name = "四川泡菜" ;
             }
             public override void ShowMaterial()
             {
                    Console.WriteLine(string .Format("{0}食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜a。" , Name));
             }
       }

       class ShanDongBin : Food
       {
             public ShanDongBin()
                   : base()
             {
                   Name = "山东大煎饼" ;
             }
             public override void ShowMaterial()
             {
                    Console.WriteLine(string .Format("{0}食材:杂粮煎饼、胡萝卜、香菜、香肠、葱花、榨菜、鸡蛋、甜面酱、芝麻酱。" , Name));
             }
       }
运行后屏幕显示:
跳跳鱼红菇汤食材:跳跳鱼、盐、豆腐、红菇。
四川泡菜食材:萝卜、豇豆、包菜、盐、水、花椒、辣椒、姜、蒜。
山东大煎饼食材:杂粮煎饼、胡萝卜、香菜、香肠、葱花、榨菜、鸡蛋、甜面酱、芝麻酱 

总结:

本人技术一般,不是不想写深点,只是太深的太理论的我写不出来,当然多态的知识太多太多,上面只是个人看到《舌尖2》后突然有感,才冒昧把食物和程序结合起来帮我理解多态和开闭原则,大神们不要笑我,我会继续努力的,也希望大家支持和推荐。
谢谢阅读。 
 

用《舌尖2》去理解C#中的多态和开闭原则的更多相关文章

  1. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  2. 最简单直接地理解Java软件设计原则之开闭原则

    写在前面 本文属于Java软件设计原则系列文章的其中一篇,后续会继续分享其他的原则.想以最简单的方式,最直观的demo去彻底理解设计原则.文章属于个人整理.也欢迎大家提出不同的想法. 首先是一些理论性 ...

  3. 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...

  4. C# 实例解释面向对象编程中的开闭原则

    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...

  5. 用《捕鱼达人》去理解C#中的多线程

    线程是进程中某个单一顺序的控制流,是程序运行中的调度单位,是程序执行流的最小单位,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成. 线程自己不拥有系统资源,只拥有一点儿在运行中必 ...

  6. 以吃货的角度去理解云计算中On-Premise、IaaS、PaaS和SaaS

    了解云计算的一定都听过四个“高大上”的概念:On-Premise(本地部署),IaaS(基础设施及服务).PaaS(平台即服务)和SaaS(软件即服务),这几个术语并不好理解.不过,如果你是个吃货,还 ...

  7. Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用

    问题:在哪里都能执行java命令,是和JAVA_HOME变量有关系呢还是path中指定的那个java路径呢?? 刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME.Path.CLASS ...

  8. 深入理解Java中的多态

    一.什么是多态? 多态指同一个实体同时具有多种形式.它是面向对象程序设计(OOP)的一个重要特征.如果一个语言只支持类而不支持多态,只能说明它是基于对象的,而不是面向对象的. 二.多态是如何实现的? ...

  9. 简单理解C#中的抽象工厂模式是什么概念!

    抽象工厂模式向客户端提供一个接口,使得客户端在不必指定具体类型的情况下,创建多个产品族中的对象.本文采取的仍然是接着以前的那个快餐店的例子.现在,快餐店经常良好,逐渐发展壮大,为了适合不同地方人的饮食 ...

随机推荐

  1. Python3的bytes和str之别

    Python3不会以任意隐式的方式混用str和bytes,正是这使得:两者的区分特别清晰,在使用Python时不能拼接字符串和字节包,也无法搜索字节包里面的字符串(反之亦然),也不能讲字符串传入参数为 ...

  2. linux 修改终端颜色

    要想修改终端的颜色,可以使用修改PS1环境变量的方式,也可以通过命令setterm来进行设置. 一.PS1 转自:修改linux终端命令行颜色 1.PS1 要修改linux终端命令行颜色,我们需要用到 ...

  3. MongoDB入门 和nodejs操作

    简介 MongoDB 开源,高性能的NoSQL数据库:支持索引.集群.复制和故障转移.各种语言的驱动程序:高伸缩性: NoSQL毕竟还处于发展阶段,也有说它的各种问题的:http://coolshel ...

  4. BZOJ2655 calc(动态规划+拉格朗日插值法)

    考虑暴力dp:f[i][j]表示i个数值域1~j时的答案.考虑使其值域++,则有f[i][j]=f[i][j-1]+f[i-1][j-1]*i*j,边界f[i][i]=i!*i!. 注意到值域很大,考 ...

  5. Ryuji doesn't want to study 2018 徐州赛区网络预赛

    题意: 1.区间求 a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r](L is the length of [ l, r ] that equals to r - l + 1) ...

  6. Continuation-passing style

    Continuation-passing style 参考书籍: EOPL (  Essentials of Programming Languages, 3rd Edition ) 作者:知乎用户链 ...

  7. 如何解决每次打开office 都会出现正在配置的问题

    原因:安装offiece的时候直接选择以前安装过的office文件夹,导致文件冲突 解决方法:卸载,然后对准备要安装的文件夹清空或者重新建个新文件夹安装

  8. 【刷题】BZOJ 4176 Lucas的数论

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

  9. 洛谷 P1412 经营与开发 解题报告

    P1412 经营与开发 题目描述 \(4X\)概念体系,是指在\(PC\)战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"\(EX\)"为开头的英语单词. \(eXplo ...

  10. 上传文件到aws的s3存储

    只要有aws-cli客户端就可以上传文件到aws的S3存储.可以在任意机器上.这里以centos为例. 1.安装python.pip. # yum install -y python python-p ...