码迷,mamicode.com
首页 > Windows程序 > 详细

C# 接口《通俗解释》

时间:2015-07-28 06:34:07      阅读:949      评论:0      收藏:0      [点我收藏+]

标签:

接口

为什么要用接口?好处在哪里?

冥冥之中你的工作是一个修水管的,一天客户找上你让你帮装水管,但是有个要求,就是客户喜欢管子是三角形的。

你立马买了三角形的水管回来,在墙上弄个三角形的口子,客户付了钱,你很开心今天有了收入,如下图,很好:

技术分享

但是好景不长,客户过了一个星期又来找,因为他觉得三角形不好看,要让你换成正方形的水管,你不得不换,因为顾客就是上帝。好吧,继续在墙上弄个正方形的口子,然后又换成正方形的管子来接上。好了,如下图:(但是可能觉得为什么一开始不说要正方形的?因为需求总在变化。。。)

技术分享

你累得满头大汗,但是还是完成了。可惜不久,客户又来找你,因为他想换成椭圆形的管子了。你可能会嘴角微微抽搐。有点抓狂。。。。

没办法,做还是要做。你又弄了几个小时完成了,如下图:

技术分享

此时你是否感觉到疲倦?如果你是一个安于现状的人,那么你的人生都在疲劳的活着。

现在想想办法,客户说不定什么时候又来换管子,因为需求是客户提的。能不能在墙上弄个固定的口子,而客户需要什么管子就把管子买来,只要接起来就行了,而不用每次换都要去墙壁挖一个符合管子的形状的口子吧?没错,就先在墙上弄个圆形的口,这个口就叫做接口。如下图:

技术分享

如你所见,墙上有个圆形的口,但是按照原本的:

三角形水管两端是三角形
正方形水管两端是正方形
椭圆形水管两端是椭圆形

那是肯定接不上的,因为三角形、正方形、椭圆形的口怎么和墙壁上圆形的口对接呢?

所以先要实现接口,把:

三角形水管一端做成圆形
正方形水管一端做成圆形
椭圆形水管一端做成圆形

如图所以,圆形接口做出来了,然是具体实现是客户去安装,接口本身并不会安装其他形状的水管,换句话说就是接口没有具体实现,只是告诉你只能这么做,因为我只留这个圆形的口子,你要装别的形状的管子,先把一个弄成圆形的就好了(子类去实现接口的方法),不管什么形状,都要一个必须做成圆形才能对接得上,这就是为什么接口也是规范,它必须要你按照我的规范来做,不然不行。这就是为什么新手会觉得接口什么都不做,就留在那里,没有任何实现,那不是多此一举吗?其实不是,因为它的实现是子类去完成。

这样只要客户喜欢什么形状的水管,只要实现了我的接口(圆形),都能对接得上,而且改变起来也很方便,只要把水管扭上去就行了,不用在去给墙壁挖口子了。

到这里你是不是已经知道接口的作用了?你可能想说,图形好理解,但是代码呢?那就往下看吧。

先声明三个类,里面都有一个print方法。

 1    //三角形
 2     public class SanJiaoXing
 3     {   
 4         public void print()
 5         {
 6             Console.WriteLine("三角形的水管接好了");
 7         }
 8     }
 9     
10     //正方形
11     public class ZhengFangXing
12     {
13         public void print()
14         {
15             Console.WriteLine("正方形的水管接好了");
16         }
17     }
18 
19     //椭圆形
20     public class TuoYuanXing
21     {
22         public void print()
23         {
24             Console.WriteLine("椭圆形的水管接好了");
25         }
26     }

当客户需要三角形管子的时候:

1         static void Main(string[] args)
2         {
3             SanJiaoXing sjx = new SanJiaoXing();
4             sjx.print();//输出:三角形的水管接好了
5 
6 
7             Console.ReadKey();
8 
9         }

过了一周,客户又需要正方形管子的时候,你又把三角形的拿走,换上正方形的(注释掉三角形):

 1         static void Main(string[] args)
 2         {
 3             //SanJiaoXing sjx = new SanJiaoXing();
 4             //sjx.print();//输出:三角形的水管接好了
 5 
 6             ZhengFangXing zfx = new ZhengFangXing();
 7             zfx.print();//输出:正方形的水管接好了
 8 
 9             Console.ReadKey();
10 
11         }

又过了一周,客户又让你换成椭圆形的管子,代码如下:

 1         static void Main(string[] args)
 2         {
 3             //SanJiaoXing sjx = new SanJiaoXing();
 4             //sjx.print();//输出:三角形的水管接好了
 5 
 6             //ZhengFangXing zfx = new ZhengFangXing();
 7             //zfx.print();//输出:正方形的水管接好了
 8 
 9             TuoYuanXing tyx = new TuoYuanXing();
10             tyx.print();//输出:椭圆形的水管接好了
11 
12             Console.ReadKey();
13 
14         }

但是客户的需求是变化的,你不知道何时他又换成别的形状的,你又大动干戈的去改代码(大项目中,改的地方很多,不是一个地方而已)。你还会安于现状吗?

于是你用了接口,先做一个接口把,就叫圆形好了:

1     //圆形的接口,只有
2     interface YuanXing
3     {
4         //必须去实现这个print方法,所以子类一定要有print方法
5         void print();
6     }

那其他形状的水管一端肯定要做成跟接口一样大小的圆形口子对吧,在代码里就是用冒号来代表:

 1  //圆形的接口,只有
 2     public interface IYuanXing
 3     {
 4         //必须去实现这个print方法,所以子类一定要有print方法
 5         void print();
 6     }
 7 
 8     //三角形
 9     public class SanJiaoXing : IYuanXing
10     {
11         public void print()
12         {
13             Console.WriteLine("三角形的水管接好了");
14         }
15     }
16     
17     //正方形
18     public class ZhengFangXing : IYuanXing
19     {
20         public void print()
21         {
22             Console.WriteLine("正方形的水管接好了");
23         }
24     }
25 
26     //椭圆形
27     public class TuoYuanXing : IYuanXing
28     {
29         public void print()
30         {
31             Console.WriteLine("椭圆形的水管接好了");
32         }
33     }

使用的时候,左边是圆形接口,右边是实现了一端为圆形的口子的各种形状的水管:

 1         static void Main(string[] args)
 2         {
 3             //左边是接口,只要把右边的三角形接进来就行了
 4             IYuanXing yx = new SanJiaoXing();
 5             yx.print();//输出:三角形的水管接好了
 6 
 7 
 8             Console.ReadKey();
 9 
10         }

如果客户需要换正方形的管子怎么办?很简单,如图片所示,做好了一端为圆形的管子,你只要放进来就可以,不用改变原来的接口。

用代码表示就是左边的接口不动,右边自己换进来:

 1         static void Main(string[] args)
 2         {
 3             //左边是接口,只要把右边的正方形接进来就行了
 4             IYuanXing yx = new ZhengFangXing();
 5             yx.print();//输出:正方形的水管接好了
 6 
 7 
 8             Console.ReadKey();
 9 
10         }

如果换成椭圆形,一样的道理:

 1         static void Main(string[] args)
 2         {
 3             //左边是接口,只要把右边的椭圆形接进来就行了
 4             IYuanXing yx = new TuoYuanXing();
 5             yx.print();//输出:椭圆形的水管接好了
 6 
 7 
 8             Console.ReadKey();
 9 
10         }

日后客户需要更奇怪的水管,只要实现了圆形接口,只用改动右边的部分。以后需要其他水管直接实现一端为圆形的口子就可以接入。

开放闭关原则:

对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
 
这两句话是概念性的东西。通俗的意思就是:
对于上面的图片来说,墙上的接口做好了,不能去改变了,但是可以扩展,你要什么形状的水管就去实现它的接口。

C# 接口《通俗解释》

标签:

原文地址:http://www.cnblogs.com/hamburger/p/4681681.html

(0)
(3)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!