青蛙學堂
c# 使用接口
c#为什么要使用接口?通俗的讲,就是为了降低耦合度。给大家看一个我见过的很搞笑的例子。看看下面的程序:一个学校里边,有两种人:学生、老师。他们都要吃饭和睡觉。
------------------------------
public interface I人
{
void 吃饭();
void 睡觉();
}
public class 学生:I人
{
public void 吃饭()
{ //去食堂吃饭 }
public void 睡觉()
{ //回寝室睡觉 }
//其他特有方法,比如泡妞、打游戏
}
public class 老师:I人
{
public void 吃饭()
{ //回家吃饭 }
public void 睡觉()
{ //回家睡觉 }
//其它特有方法,比如为生儿育女传宗接代的历史使命努力等“不足为外人道也”的事情
}
public class 学校
{
public void 开饭(I人 ren)
{ ren.吃饭(); }
public void 放学(I人 ren)
{ ren.睡觉(); }
}
-----------------------------
这里就用到了里氏代换原则,"开饭()"和"放学()"的参数都是人,那么这个地方如果换成学生和老师肯定也可以。
I人 某学生 = new 学生();
某学生.开饭();
某学生.放学();
这样执行的结果就是学生回寝室吃饭。
I人 某老师 = new 老师();
某老师.开饭();
某老师.放学();
这样执行的结果就是老师回家吃饭。
为什么要这样写呢?这样写有什么好处呢? 我在开饭的时候完全可以直接调用“学生.吃饭();”、“老师.吃饭();”。接着看,有一天,学校里来了第三种人,家长。 家长既不是去寝室睡觉也不是回家睡觉,而是旅馆睡觉,既不是去食堂吃饭也不是回家吃饭,而是去下馆子。 这个时候学校这个系统该怎么处理呢? 如果原来没有定义"I人"这个接口那就麻烦啦,所有用到人的地方代码都要改。 现在不一样了,我可以直接定义一个类:家长,这个类实现人这个接口就可以了。 好,看代码:
------------------------------
public class 家长:I人
{
public void 吃饭()
{ //下馆子 }
public void 睡觉()
{ //去旅馆睡觉 }
//其它特有方法,比如会见老师,晓之以钱,动之以利等等,不一而足
}
-------------------------------
在调用的时候不需要修改任何代码,还和原来一样:
I人 某家长=new 家长();
某家长.开饭();
某家长.放学();
轻松搞定家长的食宿问题! 这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!不知道大家看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!
先声明一下,这个案例可不是我想出来的~~但是很经典,是不?
然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了,不是么?
posted on 2020-07-24 08:49
青蛙學堂
阅读(297)
评论(0)
编辑
收藏
引用
所属分类:
c#
只有注册用户
登录
后才能发表评论。
Powered by:
IT博客
Copyright © 青蛙學堂
<
2012年4月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
导航
IT博客
首页
新随笔
联系
管理
统计
随笔 - 426
文章 - 0
评论 - 164
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(8)
给我留言
查看公开留言
查看私人留言
随笔分类
c#(58)
(rss)
CSS(7)
(rss)
Elasticsearch(4)
(rss)
ERP-U8(2)
(rss)
Fireworks
(rss)
Flash
(rss)
HTML(17)
(rss)
Java(3)
(rss)
JavaScript(31)
(rss)
Linux(5)
(rss)
LotusNotes(2)
(rss)
PHP(13)
(rss)
Python(1)
(rss)
TelePhone(1)
(rss)
VPN
(rss)
Vs2008(51)
(rss)
數據庫(61)
(rss)
硬件百科(62)
(rss)
系统(10)
(rss)
經濟論壇(18)
(rss)
網站(17)
(rss)
軟件布袋(115)
(rss)
青蛙议堂(9)
(rss)
随笔档案
2022年9月 (1)
2022年8月 (2)
2022年7月 (5)
2022年6月 (1)
2022年5月 (5)
2022年4月 (5)
2022年3月 (1)
2021年4月 (1)
2021年3月 (1)
2020年12月 (2)
2020年11月 (3)
2020年10月 (4)
2020年8月 (8)
2020年7月 (20)
2020年6月 (4)
2020年5月 (12)
2020年4月 (3)
2020年3月 (2)
2018年12月 (2)
2016年6月 (1)
2014年9月 (1)
2014年5月 (1)
2014年4月 (1)
2012年11月 (1)
2012年5月 (25)
2012年4月 (44)
2012年3月 (39)
2012年2月 (15)
2011年10月 (2)
2011年9月 (3)
2011年8月 (14)
2011年7月 (1)
2010年12月 (1)
2009年8月 (2)
2009年7月 (1)
2007年11月 (2)
2007年10月 (5)
2007年8月 (1)
2007年7月 (7)
2007年4月 (1)
2007年3月 (1)
2006年12月 (7)
2006年11月 (5)
2006年9月 (12)
2006年8月 (5)
2006年7月 (1)
2006年6月 (5)
2006年5月 (11)
2006年4月 (7)
2006年3月 (3)
2006年2月 (33)
2006年1月 (33)
2005年12月 (6)
2005年11月 (47)
收藏夹
無量洞
(rss)
百納川
(rss)
青蛙学堂
最新评论
1. re: c# Encoding.Unicode.GetBytes 转码取字符串
评论内容较长,点击标题查看
--青蛙學堂
2. re: C# 获取文件名及扩展名
well goood 6666666666666666
--6666
3. re: C# 获取文件名及扩展名
瑶瑶且可恼
--夏利
4. re: C# 获取文件名及扩展名
哟哟哟哟,切克闹
--吊炸天
5. re: php显示数据库数据
公积金
--和
6. re: AJAX--不具有名为xxxxx的公共属性 解决方法
12123
--发给
7. re: Lotus Notes 常见错误
一直显示服务器没响应,端口也连接不上
--Jason Guo
8. re: C# 获取文件名及扩展名
不好
--冰风
9. re: Lotus Notes 常见错误
NOTES怎样将所有的邮件复制到本地上呢?
--limengnan
10. re: FW:结识正能量,跟对人
太功利!
--雷鹏
11. re: C# 获取文件名及扩展名
学习了。。学习c#ing
--lvv2
12. re: Lotus Notes 常见错误
公司同事早上打开notes本来没问题的,但是安装qq浏览器后,外部发送的邮件看不了内容,但是回复或者右键点击编辑可以看到内容,是所有的外部邮件,包括以前发送的邮件
--张俊
13. re: Lotus Notes 常见错误
邮件经常提示 not a sub or function :mark message for follow up
--黄勇军
14. re: Lotus Notes 常见错误
Notes 接受外部邮件时,邮件中的表格无法显示格式,只能显示文本,但公司内部邮件没有此问题。并且外部邮件经内部同事转发后,也能正确显示格式
--Tang
15. re: Lotus Notes 常见错误
邮件中的热点链接为什么打不开?别人的可以打开.
--LH
阅读排行榜
1. C# 获取文件名及扩展名(43707)
2. Lotus Notes 常见错误(33208)
3. c# arrayList遍历(22087)
4. window.showModalDialog获取弹出页面返回值的2种方法(13518)
5. AD域维日常维护手册(8576)
6. Reporting Services 部署指南(8080)
7. ContentType--文件下载类型(6955)
8. 双网卡故障解决方法(5469)
9. c#--封装的概念(5392)
10. 如何访问局域网(4687)
11. TTimer : Delphi编写获取和设置系统时间程序(3888)
12. 用delphi写excel文件(3670)
13. CREATE INDEX(3665)
14. BAT命令(3398)
15. Access Violation at address 004CD87E in module 'MyTest.exe',Read of Address 00000008.(3179)
评论排行榜
1. Lotus Notes 常见错误(19)
2. vlan-dhcp(13)
3. 木馬(9)
4. 如何访问局域网(8)
5. 双网卡故障解决方法(8)
6. 筆記(6)
7. Edit Excel 2(5)
8. C# 获取文件名及扩展名(5)
9. sql----join(4)
10. 多VLAN环境中DHCP服务的实现(4)
11. DBCHART(4)
12. 怎樣在查詢結果中加入子序號 ? (3)
13. 多線程查詢(3)
14. CREATE TRIGGER(3)
15. trigger(2)