c# 接口和抽象类介绍

来源:互联网 发布:查看本机端口号 编辑:程序博客网 时间:2024/05/16 02:54

一、接口概述:

接口定义一种协议,实现该接口的类或结构必须遵循该协议。一个接口可以继承于一个或多个其他接口,一个类或结构也可以实现一个或多个接口。接口可以包含4中成员:方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,它仅仅指定实现该接口的类或结构必须提供的成员。

1、接口声明:需要使用interface关键字;

Public  interface  IA

{

...

2、接口修饰符:一般位于接口声明中的interface关键字之前,共包括5个修饰符:new、public、protected、internal和private。其中,public、protected、internal和private修饰符控制接口的可访问性。

Public:表示该接口是公开的,访问不受限制。

Protected:表示该接口只能是本身或其派生的接口访问。

Internal:表示该接口只能是在当前应用程序中访问。

Private:表示该接口只能是本身访问。

new修饰符:仅允许在类中定义的接口中使用,它指定接口隐藏同名的继承成员。

eg:

public  class  A

{

    public interface  IA {};  //声明IA接口

}

public  class  B:A

{

     new  publicinterface  IA {};   //声明IA接口,并使用new修饰符隐藏了A.IA接口

}

分析:B.IA表示B类中声明的IA接口。

 

3、接口继承

接口可以继承与一个或者多个其他接口,也可以不继承。被继承的接口称为该接口的显示基接口。当一个接口具有一个或者多个显示基接口时,在声明该接口时,接口标示符后就要紧跟一个冒号和一个有逗号分隔的基接口标示符列表。

eg:

public  interface  IA       //声明IA接口

{

}

public  interface  IB       //声明IA接口

{

}

public  interface  IC:IA,IB     //声明IC接口,它继承于IA和IB接口

{

}

注意:接口不能从自身直接或者间接继承,否则会发生编译时错误。

 

二、接口成员

接口成员必须是方法、属性、事件或者索引器,而不能包括常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。一个接口可以不包括任何成员,也可以包括一个或多个成员。接口成员默认隐式地具有public访问属性,而且在声明接口成员时不能包含任何修饰符(如abstract、public、protected、internal、private、virtual、override和static),否则会发生编译时错误。

注意:一个接口的成员包括两部分:有接口本身声明的成员和其从基接口继承的成员。

1、  属性

在接口中声明属性时,只能声明该属性具有哪些访问器(如get或set访问器),而不能实现该访问器。接口属性的访问器只用于表明该属性是只读的、只写的还是读写的,访问器体必须始终是一个分号。

eg:

interface  IA

{

        String  Name     ///name 属性

{

                get;      ///get 访问器,表示该属性是可读的

                set;      /// set 访问器,表示该属性是可写的

}

注意:接口属性的访问器体只能是一个分号,不能包括其实现代码。

2、  索引器

接口索引器比接口属性比较相似。在接口中声明索引器时,只能声明该索引器具有哪个访问器(如get或set访问器),而不能实现该访问器。接口索引器的访问器只用于表明该索引器是只读的、只写的还是读写的,访问器体必须始终是一个分号。

Interface  IA

{

       String  this [int index]        ///索引器

{

              get;                    /// get 访问器,表示该索引器是可读的

      set;                   /// set 访问器,表示该索引器是可写的

}

}

注意:接口索引器的访问器体只能是一个分号,不能包括其实现代码。

3、  方法

在接口中声明方法时,只能声明该方法的签名,而且该方法的方法体只能为分号,而不能包括该方法的实现代码。

Interface  IA

{

       String  GetName(int userID);

}

注意:接口方法的方法体只能是一个分号,不能包括其实现代码。

4、  事件

在接口中声明事件时,只能声明该事件的签名,而且事件的名称之后必须接一个分号。

Interface  IA

{

       event   EventHandler print;

}

 

三、实现接口

类和结构都可以实现接口。如果某一个类或结构实现了一个或多个接口,那么在声明该结构或者结构时,将实现的接口的标示符包含在该类或结构的基类列表中。

interface  IA         ///声明IA接口

{

}

public class A: IA    ///声明A类,它的基类列表包含了IA接口,因此,它实现了IA接口

{

}

注意:如果一个类或结构实现某接口,则它还隐式实现该接口的所有基接口,不管该类或结构的基类列表中是否显示包含了该接口的基接口。

interface  IA

{

String  Name      ///name 属性

{

        get;          ///get 访问器,表示该属性是可读的

        set;          /// set 访问器,表示该属性是可写的

}

String  this [int index]        ///索引器

{

              get;                    /// get 访问器,表示该索引器是可读的

set;                   /// set 访问器,表示该索引器是可写的

String  GetName(int userID);

event   EventHandler  Print;

}

1、  实现属性

实现接口属性即添加该接口属性的实现代码,接口属性的名称和实现该接口属性的名称相同。

public class A: IA        ///A类实现了IA接口

{

       string name;        ///name字段

       string Name

{

              get{return name;}         ///get访问器

      set{ name = value;}       ///set访问器

}

}

2、  实现索引器

实现接口索引器即添加该接口索引器的实现代码。

public class A: IA        ///A类实现了IA接口

{

       String[] list;        ///list字段,元素类型为string的数组

String  this [list]       

{

              get              ///get访问器

      {

        if(index<0|| index>= list.Length)  return string.Empty;  ///判断index是否合法

        return list[index];           ///获取指定位置处元素的值

}                   

set              ///set访问器

{

if(index<0 || index>= list.Length)  return; ///判断index是否合法

        list[index] =value;           ///设置指定位置处元素的值

}                 

}

}

3、  实现方法

实现接口方法即添加该接口方法的实现代码,接口方法的名称和实现该接口方法的签名相同。

public  class A: IA

{

       String  GetName(int userID)

{

       If(userID >0)  return “张三”;

       return “李四”;

}

 } 

4、  实现事件

实现接口事件即添加该接口事件的实现代码,接口事件的名称和实现该接口事件的签名相同。

public  class A: IA

{

       private  event  EventHandler  print;   /// print事件

       event  PrintEvent Print      ///实现了IA接口的event   EventHandler print事件

{

              add{ print +=value;}      /// add访问器,从print中注册事件

              remove{ print -=value;}   ///remove访问器,从print中移除事件

}

}

注意:在实现事件时,需要add访问器和remove访问器。add访问器用来注册一个事件,Remove访问器用来移除一个事件。其中,被注册和移除的事件都用默认参数value表示。

5、  抽象类和接口

抽象类使用abstract修饰符,它用于表示所修饰的类是不完整的,并且它只能用作基类。

抽象类和非抽象类区别:

1、  抽象类不能被实例化。如果抽象类使用new运算发,则发生编译时错误。

2、  允许(但不要求)抽象类包含抽象成员。

3、  抽象类不能被密封。

4、  当从抽象类派生非抽象类时,这些非抽象类必须实现所继承的所有抽象成员,即重写这些抽象成员。

 

接口使用interface修饰符,它定义一种协议,实现该接口的类或结构必须遵循该协议。

接口和抽象类区别:

1、  一个类能实现多个接口,但只能有一个父类。

2、  接口中不能包含非抽象方法,但抽象类中可以有。

3、  抽象类是一个不完整的类,需要进一步细化;而接口只是一个行为的规范,即一种协议。

4、  接口并不属于继承结构,它实际与继承无关,因此无关的类也可以实现同一个接口。

5、  接口基本不具备继承的任何基本特点,它只是承若了能够调用的方法。

6、  接口可以用于支持回调,用于回调的接口仅仅是提供指向方法的指针。

 

 

原创粉丝点击