C#夯实基础之接口(《CLR via C#》读书笔记)

时间:2022-06-22 03:52:44

一. 接口的类型

接口是引用类型.因此从值类型赋值给接口是需要装箱的.如下所示:

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 ISay catSay = new Cat(); 6 catSay.Say(); 7 Console.Read(); 8 } 9 } 10 11 interface ISay 12 { 13 void Say(); 14 } 15 struct Cat : ISay 16 { 17 public void Say() 18 { 19 Console.WriteLine("Cat Say!"); 20 } 21 }

View Code

IL代码:

我们看到,这里有一个装箱的操作,而只有把值类型转到引用类型才会产生装箱操作,因而接口是引用类型.

二. 接口的定义

我们知道,在定义一个方法的时候,我们需要定义:

1.方法的签名:也就是这个方法的名称,参数与返回值

2.方法的实现:也就是这个方法具体的内容

      接口只是定义了一系列方法的签名,不包含方法的实现,且签名不能有任何修饰符.这意味着:

1.属性 事件 索引器也可定义入接口中,因为它们本质上都是方法,不能定义字段;

2.接口不可以定义任何构造器方法

下面是IConvertible的接口定义,它定义了很多类型转换的方法,但是并没有任何实现.

三. 接口的实现(单继承与多继承)

      一个类可以同时继承m个基类(m=0,1)和n个接口(n≥0),同时类必须显式实现所有接口,接口不能继承基类,但是可以继承接口.

我们定义如下:

1 interface ITest1 2 { 3 void Test1(); 4 } 5 interface ITtest2 6 { 7 void Test2(); 8 } 9 class Base 10 { 11 }

      单继承:我们先类或接口来看只继承一个基类或接口的情况.如下所示:

1 class Test : Base//类继承类 2 class Test : ITest1//类继承接口 3 interface ITest1: ITtest2//接口继承接口 4 interface ITest1: Base//(错误)接口继承类

其实第4种情况我们也能理解:假设接口能继承类,那么我们接口是不是就有了方法的实现,前面我们说过,接口只能有方法的签名不能有方法的实现,两者就相悖了.

      多继承:我们再来看类或接口继承一个类型和多个接口的情况

1 class Test : Base,ITest1,ITtest2//类继承1个基类和多个接口 2 interface ITtest3:ITest1,ITtest2//接口继承多个接口

使用接口的多继承,可以为一个类同时约束多个方法的实现,规定一个方法必须实现所有的的方法. 这既有好处,也不坏处. 

      1:接口有什么好处?

拿我们最简单的例子来说,我们都有电脑,如果我们想为这台电脑升级一块硬盘,我们只需要更新一块符合这个电脑主板上硬盘的接口的新硬盘就可以了,我们不用更换整台电脑,也不用只更新特定厂商的硬盘. 因为所有的硬盘厂商都遵循着公共的接口标准,这样耦合就降低了.

其实,这样的例子生活中随处可见,如我们常用的USB接口,电源插座等等.

      2:接口继承的问题1