我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入理解C#之接口

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入理解C#之接口

C#之接口

在编程中,我们经常会用到接口,那什么是接口呢?

接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员。

接口使用interface 关键字进行定义,可由方法属性事件索引器或这四种成员类型的任意组合构成。

接口的特性:

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

成员。

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

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

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

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

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

为什么不能指定接口中方法的修饰符?

接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。它们默认为公有方法。


   interface IProgram  
  {     
       void Fun();  
  }   
   class Program:IProgram  
  {    
     //显式实现接口成员        
     void IProgram.Fun()     
     {        
           Console.WriteLine("I am Fun.");    
    }     
     staticvoid Main(string[] args)    
    {    
          IProgram p =new Program(); 
     //声明一个接口实例,但不是对接口进行实例化            
     p.Fun();        
     Console.Read();    
    }    
}

上面提到,实现接口可以显式实现和隐式实现,那么这两种实现到底有什么优缺点呢?

一般情况,当类或者结构要实现的是单个接口,可以使用隐式实现。

如果类或者结构继承了多个接口且接口中具有相同名称成员时,就要用到显式实现,当显式实现方式存在时,隐式实现方式就失效了。


interface IProgram
    {
        void Fun();
    }
    interface IAProgram
    {
        void Fun();
    }
    class Program : IProgram, IAProgram
    {
        void IProgram.Fun()  //显式实现接口IProgram
        {
            Console.WriteLine("I am IProgram Fun.");
        }
        void IAProgram.Fun()  //显式实现接口IAProgram
        {
            Console.WriteLine("I am IAProgram Fun.");
        }
        //public void Fun()   //隐式实现接口
        //{
        //    Console.WriteLine("I am Program Fun.");
        //}
        staticvoid Main(string[] args)
        {
            //IProgram p = new Program();
            //p.Fun();
            //IAProgram ap = new Program();
            //ap.Fun();
            Program pro =new Program();
            ((IProgram)pro).Fun();
            ((IAProgram)pro).Fun();
            Console.Read();
        }
    }

结果为:

I am IProgram Fun. I am IAProgram Fun.

接口的继承:

接口继承和类继承不同:首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。

也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,

其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。

接口可以从零或多个接口中继承。从多个接口中继承时,用":"后跟被继承的接口名字,多个接口名之间用","分割。

被继承的接口应该是可以访问得到的,比如从private 类型或internal 类型的接口中继承就是不允许的。

接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构。


interface IProgram
    {
        void Fun();
    }
    interface IAProgram:IProgram
    {
    }
    class Program :  IAProgram
    {
        void IProgram.Fun()
        {
            Console.WriteLine("I am IProgram Fun.");
        }
        staticvoid Main(string[] args)
        {
            Program pro =new Program();
            ((IAProgram)pro).Fun();
            Console.Read();
        }
    }

接口的覆盖:

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


 interface IProgram
    {
        void Fun();
    }
    abstractclass AProgram : IProgram
    {
        publicabstractvoid AFun();
        void IProgram.Fun()
        {
            AFun();
        }
    }
    class Program:AProgram
    {
        publicoverridevoid AFun()
        {
            Console.WriteLine("I am AProgram.");
        }
        staticvoid Main(string[] args)
        {
            IProgram pro =new Program();
            pro.Fun();
            Console.Read();
        }
    }

结果:

I am Aprogram.

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

当我们在实现接口的方法里调用虚函数呢?


 interface IProgram
    {
        void Fun();
    }
    class AProgram : IProgram
    {
        publicvirtualvoid AFun()    //注意这里是虚函数
        {
            Console.WriteLine("I am virtual AFun.");
        }
        void IProgram.Fun()
        {
            AFun();
        }
    }
    class Program:AProgram
    {
        publicoverridevoid AFun()  //这里是Override重写
        {
            Console.WriteLine("I am override AFun.");
        }
        staticvoid Main(string[] args)
        {
            IProgram pro =new Program();
            pro.Fun();
            Console.Read();
        }
    }

这时,我们发现,执行的顺序和上一个例子是相同的。所以结果为

I am override AFun.

由此,我们可以继续联想,当我们把override关键字,换成new呢?是不是也是同样的结果,还是和我们以前讲的例子一样,是隐藏呢?

我们把上面的例子进行改进:


interface IProgram
    {
        void Fun();
    }
    class AProgram : IProgram
    {
        publicvirtualvoid AFun()
        {
            Console.WriteLine("I am virtual AFun.");
        }
        void IProgram.Fun()
        {
            AFun();
        }
    }
    class Program:AProgram
    {
        publicnewvoid AFun()
        {
            Console.WriteLine("I am new AFun.");
        }
        staticvoid Main(string[] args)
        {
            Program pro =new Program();
            ((IProgram)pro).Fun();
            pro.AFun();
            Console.Read();
        }
    }

结果为:

I am virtual AFun. I am new AFun.

由于前面已经讲过了,这里不在对此进行分析,由此我们可知使用New关键字是对其进行隐藏,当对接口实现的方法里调用的是虚方法时,和类的执行过程是一样的。

接口和抽象类的区别。

  • 接口用于规范,抽象类用于共性。
  • 接口中只能声明方法,属性,事件,索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。
  • 抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。
  • 抽象类可以提供某些方法的部分实现,接口不可以。
  • 抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。
  • 在抽象类中加入一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这
  • 就是为什么说接口是一个类的规范了)。
  • 接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的或受保护的内部成员(其中受保护的内部成员只能在应用程序的代码或派生类中访问)。
  • 此外接口不能包含字段、构造函数、析构函数、静态成员或常量。

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

异:

  • 不能直接实例化接口。
  • 接口不包含方法的实现。
  • 接口可以实现多继承,而类只能是单继承。
  • 类定义可在不同的源文件之间进行拆分。

同:

  • 接口、类和结构可从多个接口继承。
  • 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
  • 接口可以包含事件、索引器、方法和属性。
  • 一个类可以实现多个接口。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,并在文章页面明显位置以超链接形式注明出处,否则保留追究法律责任的权利。

总结

本篇文章就到这里了,希望能给你带来帮助,也希望你能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入理解C#之接口

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入理解Android之接口回调机制

刚开始学对于这个机制理解不够深刻,现在重新整理下思路。开发中,接口回调是我们经常用到的。 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行。首先解决啥是回调:举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方
2022-06-06

深入理解Golang接口的实现原理

深入理解Golang接口的实现原理,需要具体代码示例Golang(又称Go语言)作为一种快速、可靠的编程语言,广受开发者青睐。其中,接口(Interface)是Golang语言中非常重要的概念之一,它提供了一种抽象的方式来定义对象之间的交
深入理解Golang接口的实现原理
2024-03-07

如何深入理解Java中的接口

今天就跟大家聊聊有关如何深入理解Java中的接口,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、前言前面我们说了抽象类的概述,我们对抽象类也有个认识和理解了,现在我们学习十分重要的
2023-06-21

深入理解java中抽象类和接口

相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方。往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇文章各位都能从容地明了二者...我所理解的抽象类1、抽象类和类的相
深入理解java中抽象类和接口
2021-07-19

深入理解Golang接口的底层实现原理

深入理解Golang接口的底层实现原理,需要具体代码示例Go语言(Golang)是一种由Google开发的开源编程语言,因其简洁、高效和并发特性而备受程序员青睐。在Go语言中,接口(interface)是一种非常重要的概念,它使代码更加灵
深入理解Golang接口的底层实现原理
2024-02-23

深入理解阿里云RDS数据库接口

阿里云RDS数据库接口是一种用于连接和管理阿里云RDS数据库的编程接口,它为开发者提供了丰富的功能和灵活性。本文将详细介绍阿里云RDS数据库接口的工作原理、主要功能以及如何使用它。阿里云RDS数据库接口是一个基于网络的、可以跨平台的、可以跨数据库的、可以跨数据库管理系统(DBMS)的接口,它使用了标准的SQL语法
深入理解阿里云RDS数据库接口
2023-11-12

深入理解Lambda表达式与函数式接口

Java8被称作Java史上变化最大的一个版本。其中包含很多重要的新特性,最核心的就是增加了Lambda表达式和Stream API。这两者也可以结合在一起使用。【推荐学习:java视频教程】首先来看下什么是Lambda表达式。Lambda表达式,维基百科上的
深入理解Lambda表达式与函数式接口
2016-02-15

Android Mms之:深入理解Compose

Mms中的ComposeMessageActivity(以下简称Composer)是整个Mms中最重要的一个组件,它负责编辑信息,发送信息,管理信息,接收信息,与外部应用接口。在Mms内部与Composer关联的类和组件特别多,几乎所有的类
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录