黑马程序员技术交流社区

标题: 求通俗讲解接口 [打印本页]

作者: 韩继新    时间: 2013-9-28 16:29
标题: 求通俗讲解接口
本帖最后由 韩继新 于 2013-9-29 10:27 编辑

网上看了些讲解接口的,写的好长,看完了还是不清楚接口是怎么回事?
希望可以通俗的给我讲解下,什么是接口、什么情况下用接口、接口有什么优点。最好加上简单易懂的小例子哦

作者: ☜⑦圊⑥慾➹沼    时间: 2013-9-28 16:44
什么是接口?

  接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为

  接口是这样定义的: 接口,里面包含方法,但是没有方法的具体实现。

  然后在继承该接口的类中 去实现接口中的所有方法。包括 属性、方法、事件、索引器,但是不能包括字段;

  接口中只能包含 属性、方法、事件、索引器;

  接口可以实现C# 中的多继承。(c#不可以多继承,用接口可以实现) 接口可以继承接口,可以继承多个接口;

  类可以继承接口,但是继承的类必须去实现接口中的方法代码。

  接口不能直接被实例化

  接口一般不用什么修饰符,因为接口默认的修饰符是 public 公共的。

  接口中的所有成员默认为public,因此接口中不能有private修饰符

接口的好处:

  对类的一种约束。
  如果一个项目的需求可能在不断变化的情况下,用接口可以很容易进行拓展,并不影响以前写的功能模块的代码,只要新添加类,继承这个接口就可以了。

  如果每个类都要用到一些公用的属性字段或者方法,则通过继承接口可以方便的实现,不用再每个类中都写一次公用的属性或方法。

接口中不能包含【常量、字段(域)、构造函数、析构函数、静态成员】
作者: 于振发    时间: 2013-9-28 17:42

1 接口是一种程序规范,接口中的方法必须要去实现.在写面向对象思想的程序时,在涉及到业务逻辑的类设计之前,一般先进行接口设计,也就是先做好基本的框架,在实施过程中,用类直接去继承接口,实现接口中定义的方法!首先接口也是一种类型,这样就实现了多态的概念,例如:可以将基接口直接转换为子类,或者相互间的转换!~~

2 当你在命名空间下定义了一个接口后,你可以在其他类中直接继承这个接口;例如:

public interface IDataLayer
{
public void DataRow[] GetDataRows(string TableName);
}

Class Datalayer:IDataLayer //继承于已定义的接口
{
DataLayer{} //构造函数
public DataRow[] GetDataRows(string TableName)
{

///实现代码
}

DataLayer _dataServices = new DataLayer();//实例化这个对象后,其实他可以直接转换为IDataLayer baseObject=_dataServices;

}
作者: leayon    时间: 2013-9-28 17:45
楼上说的是概念,我就给你些例子吧。
假如:有一个自定义的集合类MyAnimalList,要让这个类实现集合的一些基本功能,那么就要让它继承IEnumerable接口、ICollection接口、IList接口或者IDictionary接口。代码如下:
class MyAnimalList<T> : IEnumerable,ICollection,IList
{
    //类的成员
}
以上代码中的类继承自三个接口:IEnumeable、ICollection、IList。这三个接口分别有不同的功能,IEnumerable接口可以实现迭代集合中的项的功能,ICollection接口可以获取集合中项的个数,IList接口提供了集合中项的列表,并可以通过索引访问集合中的项的功能。由以上三点可以看出,一个类如果继承了一个接口,那么它就可以实现这个接口的功能。每个接口都有它不同的功能,当你的类想要使用这个功能的时候,你就可以让该类继承这个接口并实现它。又比如说,如果MyAnimalList类没有继承自IList接口,而是继承自IDictionary接口,那么这个类也可以提供集合中项的列表,但是我们不能通过索引来访问集合中的项,因为IDictionary接口只允许通过键值对来访问集合中的项。
如果你现在不懂集合框架的话,可以先不用管自定义集合类这个东西,没多大影响,你只需看接口部分就OK了。

作者: -___Is、_C    时间: 2013-9-28 20:24
接口把一组公共方法和属性组合起来 ,以封装特定功能的一个集合。通过类可以实现接口,这样类就支持接口所有的属性和方法。
接口只能对方法和属性进行定义,不能实现,只能由支持它的类实现。接口中的成员不能用访问符修饰,如public,private,它的成员默认为public
public interface IMyinterface
{
void Dosomething();//方法成员
int MyAttribute//属性成员
{
get;//这里只能定义这个属性是否为只读
set;
}
}
接口和抽象类比较相似,但一个类只能派生于一个抽象类,不过可以实现N个接口。

作者: 段朝骞    时间: 2013-9-28 20:31
接口使类更加规范

接口具有下列属性:
接口类似于抽象基类:实现接口的任何非抽象类型都必须实现接口的所有成员。
不能直接实例化接口。
接口可以包含事件、索引器、方法和属性。
接口不包含方法的实现。
类和结构可继承多个接口。
接口自身可从多个接口继承。
例如:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace vs1.test
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             //People p = new People("zs");//不能创建接口实例
  12.             People peMan = new Man();
  13.             People peWomen = new Women();
  14.             //peMan.name = "xiaoming";
  15.             peWomen.Name = "zhangsan";
  16.             peMan.Speak();
  17.             peWomen.Speak();
  18.             //peMan.GanHuo(); 不存在
  19.             //peWomen.FengYiFu();不存在
  20.             Console.WriteLine(peMan.Name);
  21.             Console.WriteLine(peWomen.Name);
  22.            //peWomen[1]; 索引器也无法使用
  23.            //peMan[1]; 索引器也无法使用
  24.             Women woWomen = new Women();
  25.             woWomen.FengYiFu();
  26.             woWomen.Name = "lis";
  27.             woWomen.Speak();
  28.             Console.WriteLine(woWomen[1, "xiaobai"]);
  29.             Console.ReadKey();
  30.         }
  31.     }
  32.     interface People
  33.     {
  34.         //public People(string name) { this.name = name; } //接口不能包含构造函数
  35.         //private string name; //接口不能包含字段
  36.         string Name //public修饰符不能用
  37.         {
  38.             set;
  39.             get;
  40.         }
  41.          void Speak(); //public修饰符不能用
  42.         //{
  43.         //    Console.WriteLine("interface Speak()"); //方法体不能定义
  44.         //}
  45.          string this[int index, string name] //public修饰符不能用
  46.          {
  47.              get;
  48.              //set;
  49.          }
  50.     }
  51.     class Man : People
  52.     {
  53.         public string Name { set; get; } //必须要实现接口的属性
  54.         public void Speak()  //必须要实现接口的方法
  55.         { Console.WriteLine("Man Speak()"); }
  56.         public void GanHuo()
  57.         {
  58.             Console.WriteLine("男人干累活");
  59.         }
  60.         public string this[int index,string name] //必须要实现接口的索引器
  61.         {
  62.             //set { this.Name = name; } //至少要有一个访问器
  63.            get { return Name; }
  64.         }
  65.     }
  66.     class Women : People
  67.     {
  68.         public string Name { set; get; }
  69.         public void Speak() { Console.WriteLine("Women Speak()"); }
  70.         public void FengYiFu()
  71.         {
  72.             Console.WriteLine("女人逢衣服");
  73.         }
  74.         public string this[int index,string name]
  75.         {
  76.             //set { this.Name = name; }
  77.             get { return Name; }
  78.         }
  79.     }
  80. }
复制代码
所有实现接口的类必须要重写接口中的内容,要求方法名和签名必须一致





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