• 我,只关心接口


    我们去饭店吃饭,坐下。然后叫:服务员!
    好,服务员来了。
    你会说:倒茶。或说:点菜。是吧。
    你不会说:来,我们讨论一下什么是面向对象吧。
    这是为什么呢?很简单,对你(顾客)而言,你并不关心来的是男是女,不管他是不是上知天文下知地理,文能安邦物能定国,你只要知道,来的人一定具有点菜这个业务能力。
    从代码来看,
     1    public interface IOrder//点菜
     2    {
     3        void Enregister();//记录点菜
     4        string Introduce();//介绍菜肴特色
     5    }

     6
     7    public interface IMakeTea//泡茶
     8    {
     9        void MakeTea();
    10    }

    11
    12    public interface ICheckout//买单
    13    
    14    
    15    }

    16    public class Waiter : IOrder, IMakeTea, ICheckout
    17    
    18    
    19    }


    你只关心他是不是实现了IOrder接口,其他的统统不关心。

    再说一个,公司HR发布招聘信息,要求会C#和SQL Server,ok这也是接口要求,就是说面试的人要实现ICSharp和ISQLServer接口,其他你实现了高级运动员,38红旗手,3讲活用标兵,我统统地不关心。只要你实现了ICSharp和ISQLServer接口就有资格来面试,否则统统乱棒打出。

    现在感觉是不错,但是我们再来想想我们的Person,他实现了IDoctor, IGaduate, IProfessor, IConsumer,啊,真的是多才多艺阿(如果Consumer也算才艺),
    不过我们马上会发现出现以下的场景

     1    public class OperatingRoom//手术室
     2    {
     3        public OperatingRoom(Person person)
     4        
     5        
     6        }

     7    }

     8
     9
    10    public class ClassRoom//教室
    11    {
    12        public ClassRoom(Person person)
    13        
    14        
    15        }

    16    }

    17
    18    public class Office//办公室
    19    {
    20        public Office(Person person)
    21        
    22        }

    23    }

    24
    25    public class Mall// 购物商场
    26    {
    27        public Mall(Person person)
    28        
    29        }
        
    30    }

    你认为会出现什么场景?我们这位多才多艺的大师,会在商场对收银小姐拿出刀子(void OPS()),在手术室作练习(int Exam()),也就是说Person可以完全的没有控制的使用任何实现的接口方法,所以我们的代码要改为
     1    public class OperatingRoom//手术室
     2    {
     3        public OperatingRoom(IDoctor doctor)
     4        
     5        
     6        }

     7    }

     8
     9    public class ClassRoom//教室
    10    {
    11        public ClassRoom(IGaduate gaduate)
    12        
    13        
    14        }

    15    }

    16
    17    public class Office//办公室
    18    {
    19        public Office(IProfessor professor)
    20        
    21        }

    22    }

    23
    24    public class Mall// 购物商场
    25    {
    26        public Mall(IConsumer consumer)
    27        
    28        }
        
    29    }

    如此一来,世界就安全的多了。
    我们上篇还讲到了显式实现,显式实现使C#很有意思的特色。
    想想,如果我们对Person的所有接口全部都是显式实现,那会怎么样呢?
    从表面看,他就是一个普普通通的Person,而只有进入了相应的OperatingRoom、ClassRoom、Office、Mall以后,他的相应接口才被体现出来。
    就象超人一样,平时是一个凡人,一旦穿上了S衣服和把内裤穿到外面来,就拥有了ISupperMan的方法,而你呢?你把内裤穿外面来,也不会飞起来,因为你既没有标准实现也没有显式实现ISupperMan。
  • 相关阅读:
    C++之路进阶——codevs2439(降雨量)
    C++之路进阶——codevs2933(诗人小G)
    C++之路进阶——bzoj2879(美食节)
    C++之路进阶——bzoj1934(善意的投票)
    C++之路进阶——bzoj3876(支线剧情)
    C++之路进阶——codevs1281(Xn数列)
    八数码难题
    道路游戏
    细胞分裂
    最长链
  • 原文地址:https://www.cnblogs.com/shyleoking/p/651764.html
Copyright © 2020-2023  润新知