C# 尽量使用接口来编程
2012-01-23 01:40
211 查看
作者:小聪崽的一切
出处:http://www.cnblogs.com/huangcong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
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 家长();
某家长.开饭();
某家长.放学();
轻松搞定家长的食宿问题!这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!不知道大家看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!
然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了,不是么?
出处:http://www.cnblogs.com/huangcong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
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 家长();
某家长.开饭();
某家长.放学();
轻松搞定家长的食宿问题!这样一来学校来再多的客人都没关系啊,绝对可以应付自如,这也就是传说中的可扩展性!不知道大家看到这里是不是能够明白接口的作用。如果你还不明白,那么你把人这个接口去掉,自己写一个学校开饭和放学的类,然后再加一个家长这个新新人类进去,看看你的代码是什么样子的,再想一下在人口这么多的中国,万一哪天你的学校里来了成千上万个新新人类你该怎么办!
然后我们就很好理解了,为什么用别人的东西要实现接口呢?很直接的一个原因是这样一来,编程的复杂度就可能会大大降低了,不是么?
相关文章推荐
- 黄聪:C#尽量使用接口来编程
- 黄聪:C#尽量使用接口来编程
- C#编程尽量使用接口(转)
- C#编程尽量使用接口来编程
- 尽量使用接口来编程等基本技巧
- 何时使用委托而不使用接口(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- [转]何时使用委托而不使用接口(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- 何时使用委托而不使用接口(C# 编程指南)
- 对数组使用 foreach(C# 编程指南)
- java编程,接口的使用~2
- 使用C#和.NET 4编写的并行应用程序“多核并发编程的规则”
- 全面剖析C#接口编程之接口概述
- 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
- C#接口的使用
- mybatis系列六:使用getMapper方式实现面向接口的编程