标签:
为什么要用接口?好处在哪里?
冥冥之中你的工作是一个修水管的,一天客户找上你让你帮装水管,但是有个要求,就是客户喜欢管子是三角形的。
你立马买了三角形的水管回来,在墙上弄个三角形的口子,客户付了钱,你很开心今天有了收入,如下图,很好:
但是好景不长,客户过了一个星期又来找,因为他觉得三角形不好看,要让你换成正方形的水管,你不得不换,因为顾客就是上帝。好吧,继续在墙上弄个正方形的口子,然后又换成正方形的管子来接上。好了,如下图:(但是可能觉得为什么一开始不说要正方形的?因为需求总在变化。。。)
你累得满头大汗,但是还是完成了。可惜不久,客户又来找你,因为他想换成椭圆形的管子了。你可能会嘴角微微抽搐。有点抓狂。。。。
没办法,做还是要做。你又弄了几个小时完成了,如下图:
此时你是否感觉到疲倦?如果你是一个安于现状的人,那么你的人生都在疲劳的活着。
现在想想办法,客户说不定什么时候又来换管子,因为需求是客户提的。能不能在墙上弄个固定的口子,而客户需要什么管子就把管子买来,只要接起来就行了,而不用每次换都要去墙壁挖一个符合管子的形状的口子吧?没错,就先在墙上弄个圆形的口,这个口就叫做接口。如下图:
如你所见,墙上有个圆形的口,但是按照原本的:
三角形水管两端是三角形
正方形水管两端是正方形
椭圆形水管两端是椭圆形
那是肯定接不上的,因为三角形、正方形、椭圆形的口怎么和墙壁上圆形的口对接呢?
所以先要实现接口,把:
三角形水管一端做成圆形
正方形水管一端做成圆形
椭圆形水管一端做成圆形
如图所以,圆形接口做出来了,然是具体实现是客户去安装,接口本身并不会安装其他形状的水管,换句话说就是接口没有具体实现,只是告诉你只能这么做,因为我只留这个圆形的口子,你要装别的形状的管子,先把一个弄成圆形的就好了(子类去实现接口的方法),不管什么形状,都要一个必须做成圆形才能对接得上,这就是为什么接口也是规范,它必须要你按照我的规范来做,不然不行。这就是为什么新手会觉得接口什么都不做,就留在那里,没有任何实现,那不是多此一举吗?其实不是,因为它的实现是子类去完成。
这样只要客户喜欢什么形状的水管,只要实现了我的接口(圆形),都能对接得上,而且改变起来也很方便,只要把水管扭上去就行了,不用在去给墙壁挖口子了。
到这里你是不是已经知道接口的作用了?你可能想说,图形好理解,但是代码呢?那就往下看吧。
先声明三个类,里面都有一个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 }
日后客户需要更奇怪的水管,只要实现了圆形接口,只用改动右边的部分。以后需要其他水管直接实现一端为圆形的口子就可以接入。
开放闭关原则:
标签:
原文地址:http://www.cnblogs.com/hamburger/p/4681681.html