对于接口的学习

C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认识到接口的作用的时候就觉得用接口是多此一举,当然你这样想那是绝对绝对错误的。

今天学习了接口,下面就让我来简单介绍一下接口吧!

 

一、       接口的概念及声明

 

接口是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为。接口使用interface关键字进行定义,接口可有方法、属性、事件和索引器或这四种成员的任何组合类型,但不能包含字段。

 

接口的声明:

 

 interface IPerson
 {
  void getName();//不包含方法主体
  }

 

接口的特点:

 

1.      接口类似于抽象基类,不能直接实例化接口;接口中的方法都是抽象方法,实现接口的任何非抽象类型都必须实现接口的所有成员:

 

当显式实现该接口的成员时,实现的成员不能通过类实例访问,只能通过接口实例访问。

当隐式实现该接口的成员时,实现的成员可以通过类实例访问,也可以通过接口实例访问,但是实现的成员必须是公有的。

 

2.      接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型、不能包含静态成员。

 

3.      接口成员是自动公开的,且不能包含任何访问修饰符。

 

 

4.接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类

 

在声明接口时除了Interface和接口名称是必须的,其他都是可选项。另可使用new、public、protected、intenal和private等修饰符实现接口,但接口成员必须是公共的。

 

二、接口的实现和继承

 

声明实现接口的类时,需要在基类列表中包含类所实现的接口的名称。

 

举个例子:

 

interface IProgram

   {

       void Fun();

   }

   class Program:IProgram

   {

         //显式实现接口成员

       void IProgram.Fun()

       {

            Console.WriteLine("I amFun.");

       }

       staticvoid Main(string[] args)

       {

            IProgram p =new Program();  //声明一个接口实例,但不是对接口进行实例化

            p.Fun();

            Console.Read();

       }

   }


接口的继承:

 

C#接口具有不变性,但这并不意味着接口不再发展。类似于类的继承性,接口也可以继承和发展。

 

注意:C#接口继承和类继承不同,首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。

 

接口可以从零或多个接口中继承。从多个接口中继承时,用":"后跟被继承的接口名字,多个接口名之间用","分割。被继承的接口应该是可以访问得到的,比如从private类型或internal类型的接口中继承就是不允许的。接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构。

 

    请看下面的C#接口继承例子:

interfaceIProgram

    {

        void Fun();

    }

    interface IAProgram:IProgram

    {

       

    }

    class Program :  IAProgram

    {

        void IProgram.Fun()

        {

            Console.WriteLine("I amIProgram Fun.");

        }

        staticvoid Main(string[] args)

        {

            Program pro =new Program();

            ((IAProgram)pro).Fun();

            Console.Read();

        }

}  

 

对一个接口的继承也就继承了接口的所有成员。

 

三、接口的覆盖

由于接口的实现没有方法体,抽象方法也没有方法体,那么当我们在接口的实现方法里调用抽象方法时,会如何执行呢?

 

示例:

 

interfaceIProgram

    {

        void Fun();

    }

    abstractclass AProgram : IProgram

    {

        publicabstractvoid AFun();

        void IProgram.Fun()

        {

            AFun();

        }

    }

    class Program:AProgram

    {

        publicoverridevoid AFun()

        {

            Console.WriteLine("I amAProgram.");

        }

        staticvoid Main(string[] args)

        {

            IProgram pro =new Program();

            pro.Fun();

            Console.Read();

        }

    }

//结果:I am Aprogram.

 

 

当执行pro.Fun();时,首先会跳到接口的实现方法里,然后去调用抽象函数的实现方法,当抽象函数的方法实现后,再回到接口的实现方法,直到执行完成。

 

接口和抽象类的区别:

 

接口用于规范,抽象类用于共性。

 

接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。

 

抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。

 

抽象类可以提供某些方法的部分实现,接口不可以。

 

抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。

 

在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一个类的规范了)。

 

接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。

 

此外接口不能包含字段、构造函数、析构函数、静态成员或常量。

 

C#中的接口和类有什么异同:


异:

不能直接实例化接口。

 

接口不包含方法的实现。

 

接口可以实现多继承,而类只能是单继承。

 

类定义可在不同的源文件之间进行拆分。

 

同:

接口、类和结构可从多个接口继承。

 

接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

接口可以包含事件、索引器、方法和属性。

 

一个类可以实现多个接口。

 

 

 欢迎来到unity学习unity培训unity企业培训教育专区,这里有很多U3D资源U3D培训视频U3D教程U3D常见问题U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值