黑马程序员技术交流社区

标题: 关于接口的好处,不懂啊 [打印本页]

作者: 大虾挂了    时间: 2013-10-12 16:58
标题: 关于接口的好处,不懂啊
写个简单的例子
Interface Ifly
{
void fly();
}

class Person:Ifly
{
public viod fly()
{
Console.WriteLine("Person can fly!!!");
}
}

class Animal:Ifly
{
public viod fly()
{
Console.WriteLine("Animal can fly!!!");
}
}

上面这段代码比这段代码的优势在哪?
class Person
{
public viod fly()
{
Console.WriteLine("Person can fly!!!");
}
}

class Animal
{
public viod fly()
{
Console.WriteLine("Animal can fly!!!");
}
}
把接口声明内容和类后面的:接口 部分去掉不就是这段代码么。

比如都实例化一个人和动物
Person p=new Person();
Animal a=new Animal();
当我们使用p.fly();和a.fly();时候,只不过前者认为p和a都是实现了Ifly接口中的fly(),而后者直接认为调用的是不同类中的fly()函数。

网上说使用接口可以让大型项目开发变得简单。还是那上面人和动物会飞这个例子。写人这个类的程序员只需把人这个类的相关东西写完,然后留一个会飞的接口。具体这个会飞的接口是怎么写的,是另一个人负责的。可是明显不是这样的啊。写人这个类的程序员不是必须要把接口的每个成员都实现么?相反,那个写会飞这个接口的程序员可真是闲的不行!这不科学啊!!!!!
作者: 大虾挂了    时间: 2013-10-12 17:01
能不能有个简单的例子,告诉我,这个时候,接口就是好!!!!不用接口就是麻烦!!!!
作者: §風過無痕§    时间: 2013-10-12 18:01
为什么会有接口这一概念?
     由于C#中的类不支持多重继承 而客观世界出现多重继承的情况又比较多!为了避免传统的多继承给程序员带来的复杂性等问题      

    多继承!!!!
作者: 大虾挂了    时间: 2013-10-12 18:15
§風過無痕§ 发表于 2013-10-12 18:01
为什么会有接口这一概念?
     由于C#中的类不支持多重继承 而客观世界出现多重继承的情况又比较多!为了 ...

能不能给段简单的代码,说明用接口要比把接口去掉,把接口函数直接当做类自身函数要简单呢?实在不懂接口的好处
作者: Liu阳    时间: 2013-10-12 19:09
  1.     interface IFly
  2.     {
  3.         void fly();
  4.     }
  5.     class Person : IFly
  6.     {
  7.         public void fly()
  8.         {
  9.             Console.WriteLine("Person can fly!!!");
  10.         }
  11.     }
  12.     class Animal : IFly
  13.     {
  14.         public void fly()
  15.         {
  16.             Console.WriteLine("Animal can fly!!!");
  17.         }
  18.     }
  19.     class Program
  20.     {
  21.         //
  22.         public static void FlyAction(IFly myfly)
  23.         {
  24.             myfly.fly();
  25.         }
  26.         static void Main(string[] args)
  27.         {
  28.             Person person = new Person();
  29.             Animal animal = new Animal();
  30.             //当你定义了这个方法的时候,你是不是看到了接口的好处
  31.             FlyAction(person);
  32.             FlyAction(animal);
  33.             Console.ReadKey();
  34.         }
  35.     }
复制代码

作者: 大虾挂了    时间: 2013-10-12 19:33
Liu阳 发表于 2013-10-12 19:09

可以这么写么?FlyAction方法传入参数是一个接口类型的?
后面你实际给他传的是一个i实现了这个接口的类?
好神奇。。。。。没VS,我把这段代码记下了,回去跑跑看
作者: 大虾挂了    时间: 2013-10-12 19:33
Liu阳 发表于 2013-10-12 19:09

可以这么写么?FlyAction方法传入参数是一个接口类型的?
后面你实际给他传的是一个i实现了这个接口的类?
好神奇。。。。。没VS,我把这段代码记下了,回去跑跑看
作者: 大虾挂了    时间: 2013-10-12 19:33
Liu阳 发表于 2013-10-12 19:09

可以这么写么?FlyAction方法传入参数是一个接口类型的?
后面你实际给他传的是一个i实现了这个接口的类?
好神奇。。。。。没VS,我把这段代码记下了,回去跑跑看
作者: haxyek    时间: 2013-10-12 22:46
接口一个作用是统一命名规则,比如CF
不同类型的枪开火显示出来的效果不同,
可能程序员A开发来福枪,程序员B开发沙鹰,枪都有一个动作开火,如果程序员A和程序员B在开火这个动作命名有差别。比如程序员A:来福开火,程序员B:开火。
那么在实际使用上会造成不必要的麻烦。
比如实例化了一个枪,想调用“开火”这个动作就必须要知道它里面的方法名是开火,还是来福开火。
如果用接口,那么可以统一命名。
而接口命名规则是这样:IFly 这个接口就代表他里面有个Fly()的方法(I代表接口)。这样直接能从接口名看出里面的方法。
作者: 大虾挂了    时间: 2013-10-13 00:02
haxyek 发表于 2013-10-12 22:46
接口一个作用是统一命名规则,比如CF
不同类型的枪开火显示出来的效果不同,
可能程序员A开发来福枪,程序 ...

枪也是要实现开火接口的么?还是说只要在来福枪和沙鹰枪里面实现开火接口,然后就可以实例化一个枪A=new 来福枪(),而直接用A.fire() 么。我回去试试看。

作者: 念念念念_、    时间: 2013-10-13 13:38
为什么要用接口????
        1、由于类不能多继承,所以在某些情况下,只能用接口来代替(接口可以多实现)
        2、接口的主要目的是为了实现多态
        3、当多个类型,都具有某个或者几个功能的时候,但是又不是同一个系列(没有共同的父类)这个时候不能使用抽象类。所以在这时,需要实现多态,可以考虑把这几个类型共有的方法提取到一个接口中,让这几个类型分别实现该接口
例如:飞机能飞,小鸟能飞。但是不是同属于动物类。
作者: 张锟-i    时间: 2013-10-14 11:46
给你举个现在很多网站都在用的一个例子:知道现在很多的网站都能用QQ,微博账号登陆本网站而不需要登陆吧!这就是用到了腾讯QQ给出的一个借口做的;
这样做我只要告诉你 接口 ,再提供几个方法就行了,不必知道里面到底是怎么实现的,也不会泄露了源码;

作者: ˋ初°见    时间: 2013-10-14 12:49
1.接口定义能力,即方法,由子类进行实现
2. 接口的存在就是为了实现多态
3. 接口可以解决多继承的问题
4. 接口解决了继承体积庞大的问题
5. 使用中可以将接口“当”做抽象类来使用(注意,仅仅是使用语法相似)

作者: 大虾挂了    时间: 2013-10-14 12:50
Liu阳 发表于 2013-10-12 19:09

回去尝试了下,这个确实可行,算是一个接口的好处吧,不过竟然可以这么用?传参要的是一个借口类型,而实际传入的是一个实现了这个接口的类,好神奇。
作者: 大虾挂了    时间: 2013-10-14 12:53
念念念念_、 发表于 2013-10-13 13:38
为什么要用接口????
        1、由于类不能多继承,所以在某些情况下,只能用接口来代替(接口可以多实现)
        2 ...

你说的这个不就是我开始举的那段代码的例子么?用接口反而麻烦啊,我压根不去写接口,反正写了接口也要分别在小鸟和飞机的类中详细些全fly()这个函数。我不写接口,一样也是在两个类中分别写fly()函数,这样不是更简单么?
只不过你写接口以后,使用小鸟或者飞机.fly()的时候认为你是调用的接口的能力,我不写接口认为调用的每个类中自己的fly()函数。
作者: aihuahuaxx    时间: 2013-10-14 15:43
大虾挂了 发表于 2013-10-14 12:53
你说的这个不就是我开始举的那段代码的例子么?用接口反而麻烦啊,我压根不去写接口,反正写了接口也要分 ...

如果你不接口的话,是可以实现功能,但是没有统一的定义了。

下面的每个方法都是都是零散的,没有统一的代码名称,用的时候还要一个一个去找,没有接口的多态功能了。
作者: 大虾挂了    时间: 2013-10-17 14:21
aihuahuaxx 发表于 2013-10-14 15:43
如果你不接口的话,是可以实现功能,但是没有统一的定义了。

下面的每个方法都是都是零散的,没有统一的 ...

每个类里面的方法都是一样的名字啊,比如都用fly。用的时候都只要对象名.fly()就行了啊,哪里体现出要一个个找呢?
作者: 大虾挂了    时间: 2013-10-17 14:25
因为我懂的太少了吧。希望各位大大给出类似报纸楼那样的代码,直接告诉我,用接口就是方便了。报纸楼的代码确实体现出了接口的好处,方法要求的传入参数竟然可以是接口类型的。。。。而实际传入的竟然是一个实现了这个接口的对象,确实以前不知道。
作者: 重新开始    时间: 2013-10-17 14:42
类是对象的抽象,接口是方法的抽象。
作者: 佘显郡    时间: 2013-10-19 09:24
接口的作用上面的大能都基本说了,做为1个新人,我就想知道,楼主你怎么来的这些技术分
作者: 大虾挂了    时间: 2013-10-19 12:16
佘显郡 发表于 2013-10-19 09:24
接口的作用上面的大能都基本说了,做为1个新人,我就想知道,楼主你怎么来的这些技术分 ...

多问一些问题,回答一些问题就好了,问的问题比较有新意,回答的问题代码详细,注释详细,肯定就有分了。不过像这种没技术含量的问题肯定是没分的,不过到现在除了报纸楼给了代码,其他人都光嘴上说,我根本没觉得用接口好在哪
作者: 佘显郡    时间: 2013-10-19 20:23
好吧,实现多态,多继承,就这么简单,可以理解为方法的继承,就跟万能充一样,什么电池你都能拿来充电,只要这个电池实现了充电这个方法。这个过程继承是必须的,但是万一你又需要什么电池都能当板砖,没关系,在弄个接口实现当板砖的功能。这就是多继承,而类的继承只能是一个。再说说为什么非要接口,我自己调用自己的充电方法不行吗,为什么非要用接口变量调用充电方法?有时候就不行,调用方法是要知道方法名的,还要有实例什么的,引用一个外部程序集的话你是不是还要先反编译下再写代码,给你一个对象的集合,对象千奇百怪,你只要知道这些对象能干的同一件事是什么就行了,然后统一调用,而不是一个个去调。
好吧,其实我跟你一样菜,上面的东西很片面,浅显,甚至可能说法有问题。不要当真。代码自己慢慢码吧,不知道加法,能会乘法?
作者: 茹化肖    时间: 2013-10-21 17:28
http://www.cnblogs.com/longteng1 ... /06/13/3131739.html

楼主去看看这个帖子你就知道接口的好处是啥了。还有 帖子我给你分类已解决哦。你别偷懒以后记得回来设置 ,不然大家怎么给分啊,,,,
作者: 大虾挂了    时间: 2013-10-21 17:38
茹化肖 发表于 2013-10-21 17:28
http://www.cnblogs.com/longteng1991/archive/2013/06/13/3131739.html

楼主去看看这个帖子你就知道接口 ...

我没偷懒。。。。只是我真的没找到特别心仪的答案
作者: 茹化肖    时间: 2013-10-21 17:42
大虾挂了 发表于 2013-10-21 17:38
我没偷懒。。。。只是我真的没找到特别心仪的答案

那你看看我给你这个链接了没有。我觉得很不错的讲了接口到底有什么好处的啊
作者: 大虾挂了    时间: 2013-10-21 17:44
茹化肖 发表于 2013-10-21 17:42
那你看看我给你这个链接了没有。我觉得很不错的讲了接口到底有什么好处的啊 ...

看到那个连接了,我把内容都复制下来了,我住的地方没有网络,所以目前在网吧,不打算在这里看。回去会好好看的
作者: 追溯客    时间: 2013-10-25 11:09

同学给你加分了!好好学习!蔡蔡和叶叶在黑马等着你!黑马有你更精彩!快点为了当土豪努力吧!





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2