我,只关心接口

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

 6None.gif
 7None.gif    public interface IMakeTea//泡茶
 8ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
 9InBlock.gif        void MakeTea();
10ExpandedBlockEnd.gif    }

11None.gif
12None.gif    public interface ICheckout//买单
13ExpandedBlockStart.gifContractedBlock.gif    dot.gif
14InBlock.gif    
15ExpandedBlockEnd.gif    }

16None.gif    public class Waiter : IOrder, IMakeTea, ICheckout
17ExpandedBlockStart.gifContractedBlock.gif    dot.gif
18InBlock.gif    
19ExpandedBlockEnd.gif    }


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

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

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

 1None.gif    public class OperatingRoom//手术室
 2ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
 3InBlock.gif        public OperatingRoom(Person person)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
 5InBlock.gif        
 6ExpandedSubBlockEnd.gif        }

 7ExpandedBlockEnd.gif    }

 8None.gif
 9None.gif
10None.gif    public class ClassRoom//教室
11ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
12InBlock.gif        public ClassRoom(Person person)
13ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
14InBlock.gif        
15ExpandedSubBlockEnd.gif        }

16ExpandedBlockEnd.gif    }

17None.gif
18None.gif    public class Office//办公室
19ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
20InBlock.gif        public Office(Person person)
21ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
22ExpandedSubBlockEnd.gif        }

23ExpandedBlockEnd.gif    }

24None.gif
25None.gif    public class Mall// 购物商场
26ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
27InBlock.gif        public Mall(Person person)
28ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
29ExpandedSubBlockEnd.gif        }
    
30ExpandedBlockEnd.gif    }

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

 7ExpandedBlockEnd.gif    }

 8None.gif
 9None.gif    public class ClassRoom//教室
10ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
11InBlock.gif        public ClassRoom(IGaduate gaduate)
12ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
13InBlock.gif        
14ExpandedSubBlockEnd.gif        }

15ExpandedBlockEnd.gif    }

16None.gif
17None.gif    public class Office//办公室
18ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
19InBlock.gif        public Office(IProfessor professor)
20ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
21ExpandedSubBlockEnd.gif        }

22ExpandedBlockEnd.gif    }

23None.gif
24None.gif    public class Mall// 购物商场
25ExpandedBlockStart.gifContractedBlock.gif    dot.gif{
26InBlock.gif        public Mall(IConsumer consumer)
27ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif
28ExpandedSubBlockEnd.gif        }
    
29ExpandedBlockEnd.gif    }

如此一来,世界就安全的多了。
我们上篇还讲到了显式实现,显式实现使C#很有意思的特色。
想想,如果我们对Person的所有接口全部都是显式实现,那会怎么样呢?
从表面看,他就是一个普普通通的Person,而只有进入了相应的OperatingRoom、ClassRoom、Office、Mall以后,他的相应接口才被体现出来。
就象超人一样,平时是一个凡人,一旦穿上了S衣服和把内裤穿到外面来,就拥有了ISupperMan的方法,而你呢?你把内裤穿外面来,也不会飞起来,因为你既没有标准实现也没有显式实现ISupperMan。

转载于:https://www.cnblogs.com/shyleoking/archive/2007/02/16/651764.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ 2054 Color a Tree (贪心)

$ POJ~2054~Color~a~Tree $ $ solution: $ 我们先从题中抽取信息,因为每个点的费用和染色的次数有关,所以我们可以很自然的想到先给权值大的节点染色。但是题目还说每个节点染色前它的父亲节点也必须被染色,这就有了很多的后效性。 暂时没有办…

使用Null Object设计模式[转]

在ESFramework的设计实现中,很多地方都用到了Null Object设计模式。Null Object模式的含义在于,提供一个对象给指定的类型,用以代替这个对象为空的情况。 Null Object提供了“什么也不做”的行为,隐藏来自它的合作者的细节。对于如何理解和应…

angular input使用输入框filter格式化日期

最近使用angular日期选取器。只需要把所选的输出迄今input输入框,根据默认的假设,显示是在时间的形式的时间戳。不符合规定。需要格成一个特定的公式格公式。但input上ng-model不能直接对用于filter。因此内容需要一种方法来在这里显示格式化。 网上寻找…

CH0805 防线 (二分值域,前缀和,特殊性质)

$ CH~0805~ $ 防线 (二分值域,前缀和,特殊性质) $ solution: $ 注意博主所给题面的输出和原题有些不同 这道题当时想了很久很久,就是想不到怎么写。果然还是太 $ vegetable $ 了。首先我们可以肯定的是,我们不能暴力枚举&#xff…

基于Layui实现的树形菜单页面

基于Layui实现的树形菜单页面具体方法实现方法一:针对Layui模板的前后端统一更新1. 删除2. 添加3. 后端方法二:基于Dtree实现的纯前端树形增删改文中的组件地址具体方法实现 实现树形菜单,本文将给出两种实现方式。 针对Layui前端模板EasyW…

POJ 1723 Soldiers (中位数)

$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾。所以还是列一篇题解。 这道题首先比较容易看出来的就是:行和列是两个分开的问题,而且行的移动就是一个仓库选址的板子,直接求中位数…

(一)Windows环境下汇编编程读书笔记

看了一节关于80x86系列处理器简史,不知道云里和雾里,什么晶体管啊,什么什么之类的不知道云里和雾里,看了讲什么都不知道啊! 转载于:https://www.cnblogs.com/Nuxgod/articles/692990.html

Docker知识点总结及其命令的使用

DockerDocker简介Docker与Tomcat有什么区别?Docker与虚拟机有什么区别?Docker的基本组成Docker的联合文件系统Docker基本命令Docker中的几个重要组件一、容器数据卷二、Dockerfile三、Docker网络虚拟机共享网络的三种方式Docker共享网络的四种方式Docker…

主题:Spring注解入门(转载)

原文链接:http://www.iteye.com/topic/295348 1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: Java代码 public class UserManagerImpl implements UserManager { private UserDao userDao; public void …

XDJM的情意比山高,比海深!!

又是兄弟姐妹们帮我提前过的生日,我们这帮人从SC出来后还没好好聚过,乘这个机会把大家约了出来。星期五整整一天都很快乐,特别是我,NANA,小乔期待着晚上的聚餐,期待着金贸的蛋糕,嘿嘿。。他们好…

最大子矩阵和

最大子矩阵和 $ n^3 $ 算法 $ solution: $ 首先我们不难想到枚举上下左右边界,然后两层循环统计权值和,复杂度 $ O(n^6) $ 。这个我们用前缀和可以省去后面的循环,将复杂度降成 $ O(n^4) $ 。然后我们考虑不枚举上下左右四个边界,…

Springfox-swagger使用详解

Springfox-swagger使用详解什么是Swagger?Swagger的具体使用一、导入依赖二、建立Swagger配置类三、通过Swagger测试接口引用什么是Swagger? 是一个开源的API Doc的框架可以将我们的Controller中的API方法以文档的形式展现,并支持为其添加注…

Android中调用系统已安装的播放器来播放网络流媒体视频

2019独角兽企业重金招聘Python工程师标准>>> 实现思路比较简单几行代码就可以搞定,在界面放一个Button或者带有播放图标的imageview,点击事件中调用本地播放器来播放。 Uri uri Uri.parse("http://218.200.69.66:8302/upload/Media/20…

WireShark详解

WireShark详解Wireshark介绍Wireshark使用一、基础数据说明二、指定数据包过滤Wireshark安装Wireshark介绍 Wireshark是一款可以运行在多平台的网络抓包工具,可以嗅探通过本机网卡的各类网络包,并对它们的协议,源、目标地址等多种数据进行解…

多图上传 - Web Uploader

http://fex.baidu.com/webuploader/ 官方DEMO,我都不想说了,各种问题。参考ShuaiBi文章 http://www.cnblogs.com/ismars/p/4176912.html 用了bootstrap 代码百度网盘地址:http://pan.baidu.com/s/1pJkj9wf 自己参照改改就好了。 //所有文件上…

[开发手记] 使用.NET实现你的IP切换器

发布日期:2007.4.17 作者:Anytao ©2007 Anytao.com 转贴请注明出处,留此信息。 下载:[Anytao.IPHelper][代码下载,近期上传] 本文将介绍以下内容: • 批处理文件应用 • 调用外部应用 • 文件处理…

Linux文件读写改权限详解

Linux文件读写改权限详解文件的rwx权限 [ r ][ w ][ x ]该文件可读(read)该文件可修改(write)该文件可执行(execute) 注意:只有当该文件所在目录有写权限,并且该文件有[w]权限,才可以进行删除操作 目录的rwx权限 [ r ][ w ][ x ]可查看目录…

EF 从sqlserver2008 迁移到 2005出现的BUG

在VS10Server08中使用EF4.4,发布数据库为SQL05,发生错误的问题 问题描述环境描述:工具为VS2010SQL08 R2,EntityFramework版本为4.4(在Framework4.5中为5.0),在本机完全测试完成后,发…

转盘不转动的问题

2019独角兽企业重金招聘Python工程师标准>>> Stack Overflow is a question and answer site for professional and enthusiast programmers. Its 100% free, no registration required. jQuery Rotate - IE7 & IE8 Issues up vote 11 down vote favorite 3 I a…

重构机房收费系统(二)

接上篇《机房收费系统重构(一)》 二、概要设计 完成了用例图,并用结合用例图完善了一下需求分析说明书,忘记是第几次修订需求分析说明书。有了用例图,很自然就进入了概要设计阶段。我认为这一阶段就是结合包图解决系统…