你的位置:首页 > ASP.net教程

[ASP.net教程]C#基本语法学习(九)


C#中的接口

  在C#中接口是一组公共方法或属性的集合。接口可以被其他接口或是类继承,但不能被实例化。

    1、接口中包含的属性和方法都是公共的,不是继承或是私有的。事实上,在C#中定义接口中的成员时,不允许显示指定接口成员的可访问性,而是自动默认为公共的。

    2、接口中只能包含普通方法或属性,而不能包含其他内容,如构造函数、变量等。

    3、当接口被某个类继承时,通常说类实现了这个接口,而较少说类继承了接口。

    4、接口中的方法和属性只有签名部分,而没有实现部分,甚至连接口名后面的大括号也不能有,否则会出现编译错误。

  在C#中用interface关键字定义一个接口

  访问修饰符 interface 接口名

  {

    //接口成员(方法和属性)

  }

  C#中约定接口的名字以字母I开头。如以下代码定义一个接口IPerson

 1   public interface IPerson 2   { 3     void eat(object food);   //接口的方法 4     void speak(string text);  //接口的方法 5  6     string name         //接口的属性 7     { 8       get; 9       set;10     }11   }

  如前所述,接口中不允许定义变量、构造函数,不能显示指定接口中方法或属性的可访问性。

 

  接口可以被类或者别的接口继承。类继承接口的语法与类继承类的语法相同,都是在类名后面加冒号和要继承的接口名,如下:

  访问修饰符 class 类名:接口名

  {

    //类与接口的成员

  }

  类继承接口与类继承类的不同之处在于一个类可以同时继承多个接口,但只能从一个类继承。当一个类继承多个接口时,多个接口之间用逗号隔开,如下:

  访问修饰符 class 类名:[基类名][,接口1][,接口2][...][,接口n]

  {

    //类与接口成员

  }

  接口继承接口与类继承接口语法类似,只是定义接口时使用关键字interface。

  访问修饰符 interface 接口名:[接口1][,接口2][,接口3][...][,接口n]

  {

    //接口成员

  }

  如果一个类从接口继承,那么这个类必须要实现接口中定义的所有方法和属性。由于接口定义了方法和属性的签名,而这些方法和属性的具体实现代码是在从接口继承的类里写,所以当一个类从接口继承时,通常说一个类实现了某个接口。

  这里所说的实现有两层含义:首先说明类继承于接口,其次,类中用代码实现了接口中定义的方法和属性。

  如果一个类实现了一个接口,由于类继承自接口,所以类可以隐式转换为接口,这与派生类向基类隐式转换是一样的。如果一个类实现了多个接口,那么类可以隐式转换为其中任意一个接口。

 1   public interface IPerson 2   { 3     void eat(object food);   //接口的方法 4     void speak(string text);  //接口的方法 5  6     string name         //接口的属性 7     { 8       get; 9       set;10     }11   }12 13   public class Student:IPerson14   {15 16     public void eat(object food)17     {18       Console.WriteLine(name + " eat: " + food.ToString());19     }20 21     public void speak(string text)22     {23       Console.WriteLine(name + " say: " + text);24     }25 26     private string _name;27     public string name28     {29       get30       {31         return _name;32       }33       set34       {35         _name = value;36       }37     }38   }39     static void Main(string[] args)40     {41       IPerson person;42       Console.WriteLine("Main: 通过接口调用方法");43       person = new Student();44       person.name = "Nick";45       person.eat("apple");46       person.speak("Hello");47       Console.WriteLine("Main: 通过类调用方法");48       Student s = new Student();49       s.name = "Jessice";50       s.eat("rice");51       s.speak("Hehe");52 53       Console.ReadLine();54     }

  结果

Main: 通过接口调用方法Nick eat: appleNick say: HelloMain: 通过类调用方法Jessice eat: riceJessice say: Hehe