第13章 接口

多继承(multiple inheritance)是指一个类从两个或多个基类派生的能力。

CLR不支持多继承,CLR只是通过接口提供了“缩水版”的多继承。

实现接口的类或结构必须实现接口定义中指定的接口成员。

interface IEquatable<T>

{

bool Equals(T obj);

}

实现IEquatable<T>接口的任何类或结构都必须包含与该接口指定的签名匹配的Equals方法的定义。

public class Car : IEquatable<Car>

{

public string Make { get; set; }

public string Model { get; set; }

public string Year { get; set; }

public bool Equals(Car car)

{

if (this.Make == car.Make && this.Model == car.Model && this.Year == car.Year)

{

return true;

}

else

{

return false;

}

}

}

IEquatable<T>的定义不为Equals提供实现,该接口仅定义签名。

类或结构可以实现多个接口,但是类只能继承单个类(抽象或不抽象)。

接口可以包含方法、属性、事件、索引器或这四种成员类型的任意组合。

接口成员会自动成为公共成员,不能包含任何访问修饰符。成员也不能是静态成员。

若要实现接口成员,实现类的对应成员必须是公共、非静态,并且具有与接口成员相同的名称和签名。

接口具有以下属性:

  • 接口类似于抽象基类。实现接口的任何类或结构都必须实现其所有成员。
  • 接口无法直接进行实例化。其成员由实现接口的任何类或结构来实现。
  • 接口可以包含事件、索引器、方法和属性。
  • 接口不包含方法的实现。
  • 一个类或结构可以实现多个接口。一个类可以继承一个基类,还可实现一个或多个接口。

13.1类和接口继承

从Object派生任何类实际都继承了以下内容:

  • 方法签名
  • 方法的实现(ToString, Equals, GetHashCode, GetType)

13.2定义接口

接口对一组方法签名进行了统一命名。接口还能定义事件,无参属性和索引器。所有这些本质上都是方法。但接口不能定义构造器方法。接口也不能定义任何实例字段。

C#禁止接口定义任何一种这样的静态成员。

在C#中是用interface关键字定义接口的。要为接口指定一个名称和一组实例方法签名。

对CLR而言,接口定义就像是一个类型定义。也就是说,CLR会为接口类型对象定义一个内部数据结构,同时可用反射机制来查询接口类型的功能。

和类型一样,接口可用在文件范围内定义,也可嵌套在另一个类型中定义。定义接口类型时,可指定你希望的任何可视性/可访问性(public, protect, internal等)。

接口成员会自动成为公共成员,不能包含任何访问修饰符。成员也不能是静态成员。

根据约定,接口类型名称要以大写I开头,目的是方便在源代码中辨认接口类型。

CLR支持泛型接口和在接口中的泛型方法。

13.3继承接口

以下代码展示了如何定义一个实现该接口的类型:

public interface IComparable<in T>

{

//接口成员不能包含任何访问修饰符,不能是静态成员,它会自动成为公共成员

int CompareTo(T other);

}

public sealed class Point : IComparable<Point>

{

private Int32 m_x, m_y;

//接口不能定义构造器方法,实现接口的类可以定义构造器方法

public Point(Int32 x, Int32 y)

{

m_x = x;

m_y = y;

}

//和接口对应的成员必须是公共非静态的,和接口成员相同的名称和签名

public Int32 CompareTo(Point other)

{

return Math.Sign(Math.Sqrt(m_x * m_x + m_y * m_y)

- Math.Sqrt(other.m_x * other.m_x + other.m_y * other.m_y));

}

public override String ToString()

{

return String.Format("{0},{1}", m_x, m_y);

}

}

public static class Program

{

public static void Main()

{

Point[] points = new Point[] { new Point(3, 3), new Point(1, 2) };

if (points[0].CompareTo(points[1]) > 0)

{

Point tempPoint = points[0];

points[0] = points[1];

points[1] = tempPoint;

}

Console.WriteLine("Points from closest to (0,0) to farthest:");

foreach (Point p in points)

Console.WriteLine(p);

}

}

C#编译器要求将用于实现一个接口的方法标记为public。

编译器会将实现接口的方法标记为virtual和sealed。

时间: 2024-10-14 01:39:18

第13章 接口的相关文章

第 13 章 装饰模式【Decorator Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> Ladies and gentlemen,May I get your attention,Please?,Now I’m going to talk about decoratorpattern.装饰模式在中国使用的那实在是多,中国的文化是中庸文化,说话或做事情都不能太直接,需要有技巧的,比如说话吧,你要批评一个人,你不能一上来就说你这个做的不对,那个做的不对,你要先肯定他的成绩,表扬一下优点,然后再指出瑕疵,指出错误的地方

第13章 线程

第13章 线程线程具有提高执行速度的特点. 本章重点:----------------------------------线程的基本概念创建并使用线程线程的让步.同步等操作 进程就是一个执行中的程序,每一个进程都有其独立的内存空间和系统资源.进程就是一个运行的程序,Windows操作系统是支持多进程的操作系统,即同一时间可以执行多个程序,每个程序是在自己独立的内存空间内,使用自己被分配到的系统资源.线程是CPU调度和分派的基本单位,一个进程可以由多个线程组成,而这多个线程共享同一个存储空间,这使

【Android】13.0 第13章 创建和访问SQLite数据库&mdash;本章示例主界面

分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们主要学习如何使用SQLite数据库存取数据. 1.SQLite是个什么档次的数据库 SQLite是一种免费的.开源的数据库,由于它独特的设计(把各种数据类型都转换为它自己内部处理的5种类型)导致其占用内存极少,因此很多项目都喜欢使用它. Android集成了SQLite并内置了专门对SQLite操作

C++ primer plus读书笔记——第13章 类继承

第13章 类继承 1. 如果购买厂商的C库,除非厂商提供库函数的源代码,否则您将无法根据自己的需求,对函数进行扩展或修改.但如果是类库,只要其提供了类方法的头文件和编译后的代码,仍可以使用库中的类派生出新的类.而且可以在不公开实现的情况下将自己的类分发给其他人,同时允许他们在类中添加新特性. 2. 派生类构造函数首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数. 3. 创建派生类对象时,程序首先调用基类构造函数,然后再调用派生类构造函数.派生类对象过期时,程序将首先调用派生

3.28日第七次作业12章沟通管理13章合同管理

3.28日第七次作业12章沟通管理13章合同管理   第12章.项目沟通管理   1.项目沟通管理包括哪些过程?(记)P349 答:1).沟通计划编制 2).信息分发 3).绩效报告 4).项目干系人管理 2.阻碍有效沟通的因素有哪些?P351-352 答:1).沟通双方的物理距离 2).沟通的环境因素 3).缺乏清晰的沟通渠道 4).复杂的组织结构 5).复杂的技术术语 6).有害的态度 3.沟通计划编制的第一步是什么?目的是什么?P353 答:沟通计划编制的第一步是干系人分析.其目的是得出项

第13章 物联网的产业与发展趋势

第13章 物联网的产业与发展趋势 “物联网”概念的问世,打破了之前的传统思维.过去的思路一直是将物理基础设施和IT基础设施分开:一方面是机场.公路.建筑物,而另一方面是数据中心,个人电脑.宽带等.而在“物联网”时代,钢筋混凝土.电缆将与芯片.宽带整合为统一的基础设施,在此意义上,基础设施更像是一块新的地球工地,世界的运转就在它上面进行,其中包括经济管理.生产运行.社会管理乃至个人生活. 物联网可以提高经济,大大降低成本,物联网将广泛用于智能交通.地防入侵.环境保护.政府工作.公共安全.智能电网.

第13章 MySQL服务器的状态--高性能MySQL学习笔记

13.1 系统变量 -- 服务器配置变量 MySQL通过SHOW VARIABLES  SQL命令显示许多系统变量. 13.2 状态变量--SHOW STATUS SHOW STATUS 命令会在一个由两列(名称/值)组成的表格里显示服务器状态变量.这些变量都是只读的. SHOW STATUS默认显示会话变量,SHOW GLOBAL STATUS显示全局变量. 也可以从INFORMATION_SCHEMA.GLOBAL_STATUS和INFORMATION_SCHEMA.SESSION_STAT

《Cortex?-A系列编程者指南(V3.0)》第13章&lt;中断处理&gt;笔记

在本章,我们会看看ARM处理器处理中断的一系列方法,简单地看看通用中断控制器(Generic Interrupt Controller,GIC)架构. 旧版本的ARM架构允许实现者在他们的外部中断控制器设计中相当大的自由,没有关于中断类型或数量,或者是被用于中断控制模块接口的软件模型的协议.GIC架构提供一个更为严格的控制规范,使得来自不同制造商之间的中断控制器之间有更高程度的一致性.这使得中断处理代码变得更加可移植. 13.1 外部中断请求 如我们在第12章的异常类型中讨论的,所有的ARM处理

敏捷软件开发:原则、模式与实践——第13章 写给C#程序员的UML概述

第13章 写给C#程序员的UML概述 UML包含3类主要的图示.静态图(static diagram)描述了类.对象.数据结构以及它们之间的关系,藉此表现出了软件元素间那些不变的逻辑结构.动态图(dynamic diagram)展示了软件实体在运行过程中是如何变化的,其中描述了运行流程或者实体改变状态的方式.物理图(physical diagram)展示了软件实体不变的物理结构,其中描述了诸如源文件.库.二进制文件.数据文件等物理实体以及它们之间的关系. 查看如下代码,这段程序实现了一个基于简单