定义

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

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

定义接口语法:

interface  接口名称
{
接口成员;
}

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

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

using System;

namespace app
{
interface IBook
{
int Id { get; set; }
string Name { get; set; }
double Price { get; set; }
double SalePrice(int discount);
}
}  

实现

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

实现接口语法:

class  类名 : 接口名
{
//类中的成员以及实现接口中的成员
}

在实现接口的成员时有两种方式,隐式实现接口成员和显式实现接口成员。隐式实现接口成员是将接口的所有成员以 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;
        }
    } 

隐式实现后进行运行:

    class Program
{
static void Main(string[] args)
{
Book book = new Book();
book.Id = 1001;
book.Name = "tynam";
book.Price = 60; Console.WriteLine("id:{0}" , book.Id);
Console.WriteLine("书名:{0}" , book.Name);
Console.WriteLine("定价:{0}", book.Price);
Console.WriteLine("售卖价:{0}", book.SalePrice(8));
}
}

  

运行后结果:

id:1001
书名:tynam
定价:60
售卖价:48

显式实现:

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

显式实现后进行运行:

    class Program
{
static void Main(string[] args)
{
Book book = new Book();
IBook bookDetail = book;
bookDetail.Id = 1001;
bookDetail.Name = "tynam";
bookDetail.Price = 60; Console.WriteLine("id:{0}" , bookDetail.Id);
Console.WriteLine("书名:{0}" , bookDetail.Name);
Console.WriteLine("定价:{0}", bookDetail.Price);
Console.WriteLine("售卖价:{0}", bookDetail.SalePrice(8));
}
}

运行后结果:

id:1001
书名:tynam
定价:60
售卖价:48

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

多态

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

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

    interface IBird
{
void fly();
} class Phoenix : IBird
{
public void fly()
{
Console.WriteLine("凤凰会飞");
}
} class Duck : IBird
{
public void fly()
{
Console.WriteLine("鸭子也会飞");
}
}

实例化后执行:

        class Program
{
static void Main(string[] args)
{
IBird phoenix = new Phoenix();
phoenix.fly();
IBird duck = new Duck();
duck.fly();
}
}

执行结果:

凤凰会飞
鸭子也会飞

  

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. PHP addcslashes() 函数

    实例 在字符 "W" 前添加反斜杠: <?php 高佣联盟 www.cgewang.com$str = addcslashes("Hello World!" ...

  2. 7.3 NOI模拟赛 苹果 随机 高维前缀和

    头一次遇到高维前缀和的题目 所以赛时不太会写. \(n\cdot Mx\cdot log\)的暴力做法这里不再赘述. 容易想到随机一个数字 然后其有\(\frac{1}{2}\)的概率在答案的集合中. ...

  3. 【NOIP2017】跳房子 题解(单调队列优化线性DP)

    前言:把鸽了1个月的博客补上 ----------------- 题目链接 题目大意:机器人的灵敏性为$d$.每次可以花费$g$个金币来改造机器人,那么机器人向右跳的范围为$[min(d-g,1),m ...

  4. SpringMVC入门和常用注解

    SpringMVC的基本概念 关于 三层架构和 和 MVC 三层架构 我们的开发架构一般都是基于两种形式,一种是 C/S 架构,也就是客户端/服务器,另一种是 B/S 架构,也就 是浏览器服务器.在 ...

  5. Java高级篇反射和注解

    反射是什么? 反射的作用?能带来什么好处? 反射的使用? 注解的使用? 注解和反射配合实战...

  6. Kibana配置nginx反代并本地ca加密nginx

    简介 我们部署完ELK Stack后,虽然可以直接浏览器访问kibana进行访问,但这样对一些重要数据来说是不安全的,可以利用密码验证设置权限访问,在Kibana所在的服务器上安装Nginx服务,利用 ...

  7. Netty(二):如何处理io请求?

    文接上一篇.上篇讲到netty暴露一个端口出来,acceptor, handler, pipeline, eventloop 都已准备好.但是并没体现其如何处理接入新的网络请求,今天我们就一起来看看吧 ...

  8. C#LeetCode刷题之#507-完美数(Perfect Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3879 访问. 对于一个 正整数,如果它和除了它自身以外的所有正因 ...

  9. C#LeetCode刷题之#69-x 的平方根(Sqrt(x))

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3848 访问. 实现 int sqrt(int x) 函数. 计算 ...

  10. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    上一章回顾:  .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...