我,只关心接口

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

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

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

16 None.gif     public   class  Waiter : IOrder, IMakeTea, ICheckout
17 ExpandedBlockStart.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也算才艺),
不过我们马上会发现出现以下的场景

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

 7ExpandedBlockEnd.gif    }

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

16ExpandedBlockEnd.gif    }

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

23ExpandedBlockEnd.gif    }

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

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

 7ExpandedBlockEnd.gif    }

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

15ExpandedBlockEnd.gif    }

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

22ExpandedBlockEnd.gif    }

23 None.gif
24 None.gif     public   class  Mall //  购物商场
25 ExpandedBlockStart.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值