定义

在 C# 语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用“:”来表示。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。

定义接口语法:

  1. interface 接口名称
  2. {
  3. 接口成员;
  4. }

接口命名通常以 I 字母开头,例如Itest。
接口成员,不允许使用 public、private、protected、internal 访问修饰符,不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段,定义的方法不能包含方法体。

示例:定义一本书的接口,有id、名称name、定价price几个属性,和一个方法售卖价SalePrice()。

  1. using System;
  2.  
  3. namespace app
  4. {
  5. interface IBook
  6. {
  7. int Id { get; set; }
  8. string Name { get; set; }
  9. double Price { get; set; }
  10. double SalePrice(int discount);
  11. }
  12. }  

实现

接口的实现与类的继承语法格式类似,也是重写了接口中的方法,让其有了具体的实现内容。

实现接口语法:

  1. class 类名 : 接口名
  2. {
  3. //类中的成员以及实现接口中的成员
  4. }

在实现接口的成员时有两种方式,隐式实现接口成员和显式实现接口成员。隐式实现接口成员是将接口的所有成员以 public 访问修饰符修饰。显式实现接口是指在实现接口时所实现的成员名称前含有接口名称作为前缀。
下面对一本书的接口分别使用隐式实现和显式实现。

隐式实现:

    class Book:IBook
    {
        // 隐式的实现接口中的属性
        public int Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
        // 隐式实现接口中的方法
        public double SalePrice(int discount)
        {
            double salePrice = Price * discount * 0.1;
                        return salePrice;
        }
    } 

隐式实现后进行运行:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Book book = new Book();
  6. book.Id = 1001;
  7. book.Name = "tynam";
  8. book.Price = 60;
  9.  
  10. Console.WriteLine("id:{0}" , book.Id);
  11. Console.WriteLine("书名:{0}" , book.Name);
  12. Console.WriteLine("定价:{0}", book.Price);
  13. Console.WriteLine("售卖价:{0}", book.SalePrice(8));
  14. }
  15. }

  

运行后结果:

  1. id1001
  2. 书名:tynam
  3. 定价:60
  4. 售卖价:48

显式实现:

  1. class Book:IBook
  2. {
  3. public double Price { get; set; }
  4. // 显示的实现接口中的属性
  5. int IBook.Id { get; set; }
  6. string IBook.Name { get; set; }
  7.  
  8. // 显式实现接口中的方法
  9. double IBook.SalePrice(int discount)
  10. {
  11. double salePrice = Price * discount * 0.1;
  12. return salePrice;
  13. }
  14.  
  15. }

显式实现后进行运行:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Book book = new Book();
  6. IBook bookDetail = book;
  7. bookDetail.Id = 1001;
  8. bookDetail.Name = "tynam";
  9. bookDetail.Price = 60;
  10.  
  11. Console.WriteLine("id:{0}" , bookDetail.Id);
  12. Console.WriteLine("书名:{0}" , bookDetail.Name);
  13. Console.WriteLine("定价:{0}", bookDetail.Price);
  14. Console.WriteLine("售卖价:{0}", bookDetail.SalePrice(8));
  15. }
  16. }

运行后结果:

  1. id1001
  2. 书名:tynam
  3. 定价:60
  4. 售卖价:48

注意:接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。

多态

使用接口实现多态 需要满足以下两个条件。
定义接口并使用类实现了接口中的成员。
创建接口的实例指向不同的实现类对象。

示例:定义一个接口名称为 IBird,分别定义两个实现类 Phoenix 和 Duck 来实现接口的成员,代码如下。

  1. interface IBird
  2. {
  3. void fly();
  4. }
  5.  
  6. class Phoenix : IBird
  7. {
  8. public void fly()
  9. {
  10. Console.WriteLine("凤凰会飞");
  11. }
  12. }
  13.  
  14. class Duck : IBird
  15. {
  16. public void fly()
  17. {
  18. Console.WriteLine("鸭子也会飞");
  19. }
  20. }

实例化后执行:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. IBird phoenix = new Phoenix();
  6. phoenix.fly();
  7. IBird duck = new Duck();
  8. duck.fly();
  9. }
  10. }

执行结果:

  1. 凤凰会飞
  2. 鸭子也会飞

  

C#-接口(Interface)详解的更多相关文章

  1. c#接口使用详解

    c#接口使用详解 c#中接口隐式与显示实现 c#中接口可以隐式实现.显示实现,隐式实现更常使用.显示实现较少使用 其区别在于 显示实现避免接口函数签名冲突 显示实现只可以以接口形式调用 显示实现其子类 ...

  2. Java之函数式接口@FunctionalInterface详解(附源码)

    Java之函数式接口@FunctionalInterface详解 函数式接口的定义 在java8中,满足下面任意一个条件的接口都是函数式接口: 1.被@FunctionalInterface注释的接口 ...

  3. Java语言Socket接口用法详解

    Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Serve ...

  4. SpringMVC(4.2):Controller接口控制器详解(2)

    原文出处: 张开涛 4.5.ServletForwardingController 将接收到的请求转发到一个命名的servlet,具体示例如下: package cn.javass.chapter4. ...

  5. WebApi 接口参数详解

    WebApi 接口参数不再困惑:传参详解   阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为 ...

  6. 微信JS-SDK之图像接口开发详解

    由于现在手头的项目中有一个上传证件照认证的功能(手机端),之前的思路是直接点击上传,然后直接将图片上传到服务器去,这篇文章有讲到(http://www.cnblogs.com/it-cen/p/453 ...

  7. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )

    根据 上一篇 文章 , ETH  DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析  我们找到了   数据 的 ...

  8. Go语言interface详解

    interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服. 什么是interface 简单 ...

  9. SCSI接口图文详解

    目前存储设备的接口有五大类:IDE.SCSI.USB,并行口,串口,其中并行口与串口的速度非常慢,不提也罢,最主要的就是IDE,usb,SCSI.IDE(Integrated Drive Electr ...

随机推荐

  1. 预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值

    PHP $_POST 变量 在 PHP 中,预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值. $_POST 变量 预定义的 $_POST 变量用 ...

  2. PHP array_key_exists() 函数

    实例 检查键名 "Volvo" 是否存在于数组中: <?php $a=array("Volvo"=>"XC90","B ...

  3. 第二次作业:卷积神经网络 part 1

    第二次作业:卷积神经网络 part 1 视频学习 数学基础 受结构限制严重,生成式模型效果往往不如判别式模型. RBM:数学上很漂亮,且有统计物理学支撑,但主流深度学习平台不支持RBM和预训练. 自编 ...

  4. MyBatis-Plus使用(2)-CRUD接口

    参考文档:https://mybatis.plus/guide/crud-interface.html MyBatis-Plus自带的CRUD方法分为Mapper层和Service层,大多数功能是重叠 ...

  5. MySql大表分页(附独门秘技)

    问题背景 MySql(InnoDB)中的订单表需要按时间顺序分页查询,且主键不是时间维度递增,订单表在百万以上规模,此时如何高效地实现该需求? 注:本文并非主要讲解如何建立索引,以下的分析均建立在有合 ...

  6. 【HDU5869】 Different GCD Subarray Query 题解 (线段树维护区间GCD)

    题目大意:求区间$[L,R]$中所有子区间产生的最大公因数的个数. ------------------------- 对于$gcd$,我们知道$gcd(a,b,c)=gcd(gcd(a,b),c)$ ...

  7. 新鲜整理的Java学习大礼包!!锵锵锵锵~

    第一部分:Java视频资源! 前端 HTML5新元素之Canvas详解 https://www.bilibili.com/video/BV1TE41177TE HTML5之WebStorage详解 h ...

  8. 从零搭建Spring Boot脚手架(1):开篇以及技术选型

    1. 前言 目前Spring Boot已经成为主流的Java Web开发框架,熟练掌握Spring Boot并能够根据业务来定制Spring Boot成为一个Java开发者的必备技巧,但是总是零零碎碎 ...

  9. “随手记”开发记录day15

    今天完成了前两天没有完成的增加“修改”功能.对于已经添加的记账记录,长按可以进行修改和删除的操作.

  10. Python监控你的女朋友/男朋友每天都在看哪些网站

    需求: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提 ...