定义

在 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. 如何部署redis服务

    使用工具 redis-64-3.2.100 部署系统 windows server 2012R2 1.下载安装redis-64-3.2.100安装包,下载地址:https://github.com/m ...

  2. Virtuoso 中的窗口_1

    https://www.cnblogs.com/yeungchie/ hiDisplayAppDBox(简单弹出一个字符串,Tips) prog((TipsForm) hiDisplayAppDBox ...

  3. [转]Java 逃逸分析

    作者:栈长  公众号:Java技术栈 记得几年前有一次栈长去面试,问到了这么一个问题:Java中的对象都是在堆中分配吗?说明为什么! 当时我被问得一脸蒙逼,瞬间被秒杀得体无完肤,当时我压根就不知道他在 ...

  4. DeepVO: Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Networks

    1.Introduction DL解决VO问题:End-to-End VO with RCNN 2.Network structure a.CNN based Feature Extraction 论 ...

  5. 用Python玩连连看是什么效果?

    1.前言 Python实现的qq连连看辅助, 仅用于学习, 请在练习模式下使用, 请不要拿去伤害玩家们... 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道 ...

  6. C语言学习笔记之函数指针与函数指针数组

    指针函数:本质是一个函数: 是一个返回指针类型的函数int * sum(){ } 函数指针:本质是一个指针: 是一个指向函数的指针 int (*p)(int,int) = sum; p(5,6); i ...

  7. 什么才是定制化IDE的核心价值?

    写在前面 自 2018 年初,就与 VSCode 结下了不解之缘,从一份选型报告开始,一蹉跎就是 2 年多 期间反复思索着一个挥之不去的问题:定制化 IDE 产品的核心价值是什么? 事实上,答案并不唯 ...

  8. JavaScript 防抖(debounce)和节流(throttle)

    防抖函数 触发高频事件后,n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 /** * * @param {*} fn :callback function * @param {* ...

  9. ES6语法学习(一)-let和const

    1.let 和 const 变量提升: 在声明变量或者函数时,被声明的变量和函数会被提升到函数最顶部: 但是如果声明的变量或者函数被初始化了,则会失去变量提升: 示例代码: param2 = &quo ...

  10. 理解RESTful原理

    如何给老婆解释什么是RESTful 老婆经常喜欢翻看我订阅的技术杂志,她总能从她的视角提出很多有趣的问题. 一个悠闲的周日下午,她午觉醒来,又习惯性的抓起这个月的杂志,饶有兴趣地看了起来. 果不其然, ...