zoukankan      html  css  js  c++  java
  • 设计模式: 细节[装饰模式]

     public abstract class Beverage
        {
            protected string description = "Unknown Description";
            public virtual string getDescription()
            {
                return description;
            }
            public abstract double Cost();
        }
        public class Espresso : Beverage
        {
            public Espresso()
            {
                description = "Espresso";
            }
            public override double Cost()
            {
                return 1.99;
            }
        }
        public class HouseBlend : Beverage
        {
            public HouseBlend()
            {
                description = "Hous eBlend";
            }
            public override double Cost()
            {
                return 0.85;
            }
        }
        public abstract class CondimentDecorator : Beverage
        {
            //public abstract new string getDescription();
        }
        public class Mocha : CondimentDecorator
        {
            Beverage beve;
            public Mocha(Beverage b)
            {
                beve = b;
            }
            public override string getDescription()
            {
                return beve.getDescription() + ",   Mocha";
            }
            public override double Cost()
            {
                return 0.1 + beve.Cost();
            }
        }
        public class Wisp : CondimentDecorator
        {
            Beverage beve;
            public Wisp(Beverage b)
            {
                beve = b;
            }
            public override string getDescription()
            {
                return beve.getDescription() + ",   Wishp";
            }
            public override double Cost()
            {
                return 0.9 + beve.Cost();
            }
        }
        public class test : CondimentDecorator
        {
            //Beverage beve;
            public test()
            {
                //beve = b;
            }
            public override string getDescription()
            {
                //return beve.getDescription() + ",   Wishp";
                return "test";
            }
            public override double Cost()
            {
                //return 0.9 + beve.Cost();
                return 1.1;
            }
        }

    以上代码来自 HEAD FIRST ,红色的virtual是原文中没有的, 调料类中的注释也是没有的,相当于,在原文中,基类里面的getDescription函数不是虚函数,在调料类里面抽象化了,

    按照JAVA的理解,实际上也没错,毕竟饮料类GetDescription是不需要覆写的,只要把description设置一下就OK了, 调料里面要覆写

    但是在C#中运行是有问题的,我猜,C#在发现基类中的GetDescription不是虚方法后,调料类实例化后,调用的Get函数,都是基类的,

    所以,为了适应.NET平台,要把基类的get虚拟化,因为virtual不要求子类一定要覆写这个方法,只是说,可以覆写,所以不影响饮料类.

       这里还是感慨一下,细节决定成败啊! 

  • 相关阅读:
    超级好用的excel导出方法,比phpexcel快n倍,并且无乱码
    PHP生成随机数;订单号唯一
    php判断检测一个数组里有没有重复的值
    修改git 提交的用户名和用户Email命令
    利用 PHP CURL zip压缩文件上传
    Linux 重启 PHP-FPM 命令
    Postgresql 时间串转换格式
    rollup node.js 打包工具
    PHP正则表达式提取html超链接中的href地址
    解决Ubuntu系统下 mysql 远程连接失败的问题 ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xx.xx' (110)
  • 原文地址:https://www.cnblogs.com/davytitan/p/2986281.html
Copyright © 2011-2022 走看看