再次温故--装饰模式


  今天学习python的时候遇到装饰器,文章说跟装饰模式差不多,想到之前看过的装饰模式,现在已经淡然忘却,重拾记忆,搜索装饰模式,自己有C#语法的基础也就找到一篇用C#语法写的,自己之前看到一个孙悟空的例子,结合这次,自己编写一遍.

namespace ProTest
{
    abstract class  齐天大圣
    {
        public abstract void 变();
    }
    class 孙悟空: 齐天大圣
    {
        public override void 变()
        {
            Console.WriteLine("我要变身了");
        }
    }

    class 七十二变 : 齐天大圣
    {
        protected 齐天大圣 大圣;
        public void 设置(齐天大圣 齐天)
        {
            大圣 = 齐天;
        }
        public override void 变()
        {
            if (大圣 != null)
            {
                大圣.变();
            }
        }
    }
    class 鱼 : 七十二变
    {
        public override void 变()
        {
            base.变();
            Console.WriteLine("会游泳了.");
        }
    }
    class 鸟 : 七十二变
    {
        public override void 变()
        {
            base.变();
            Console.WriteLine("会飞了.");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            孙悟空 猴子 = new 孙悟空();
            鱼 小鱼 = new 鱼();
            鸟 小鸟 = new 鸟();
            小鱼.设置(猴子);
            小鸟.设置(小鱼);
            小鸟.变();
            Console.Read();
        }
    }
}

  结果:

  我突如其来的想法,C#支持中文就使用了中文命名.只是为了理解设计模式..

  在这里如果不太理解override的话,对这段代码也就理解的不够深刻.

  如果感觉已经理解,那么请问鱼类和鸟类去掉override,将会输出什么?

  只会输出.

  写这一段代码的时候,很顺利写下来.最后运行的时候,结果不对,才发现没有加override,赤裸裸的说明自己基础没有夯实.

  于是想到了之前看过的问题,自己测试了一下也就明白了override了:

  如果理解这四张图输出结果.那就理解了override了.自己动手测试一下吧..

  如果自己对new关键字理解不太清楚,也可以结合这4张图理解一下new关键隐藏基类含义.