C# 接口详解:从入门到理解其设计价值
一、引言C# 接口是一个让很多初学者容易迷糊的概念。用起来好像很简单定义接口里面包含方法但没有方法具体实现的代码然后在继承该接口的类里面实现接口的所有方法。但没有真正认识到接口的作用时就会觉得用接口是多此一举。当然你这样想是绝对错误的。微软请的员工都是聪明人他们的 C# 能这样设计自然有其深刻的道理。二、接口的基本理解可以简单地这样理解接口接口是方法的抽象。如果不同的类有同样的方法那么就应该考虑使用接口。例如人和车都有跑的方法那么就可以定义一个接口 IRun// 注意定义接口时里面的方法不能有方法体 // 应该在类里再去实现 // 而接口的成员全是公有的不应有修饰符 public interface IRun { void Run(); }三、接口的实现3.1 人实现跑public class Person : IRun { public Person() { // 构造函数 } // 以下是人对跑的具体实现 public void Run() { Console.WriteLine(人用两脚跑); } }3.2 车实现跑public class Car : IRun { public Car() { // 构造函数 } // 以下是车对跑的具体实现 public void Run() { Console.WriteLine(车用四轮跑); } }四、一个类实现多个接口此外一个类还可以实现多个接口。比如人可以出声音、还可以跑那么可以让人同时实现跑和出声音这两个接口。我们定义一个接口public interface IBark { void Bark(); }再定义一个类继承于 IBark并且必须实现其中的 Bark() 方法public class Dog : IBark { public Dog() { } public void Bark() { Console.WriteLine(汪汪); } }然后声明 Dog 的一个实例并调用 Bark() 方法Dog 旺财 new Dog(); 旺财.Bark();试想一下若是想调用 Bark() 方法只需要在 Dog 类中声明这样的一个方法不就行了吗干什么还要用接口呢因为接口中并没有 Bark() 的具体实现真正的实现还是在 Dog 类中那么使用接口不是多此一举吗五、接口的本质协定与约束还有人是这样说的从接口的定义方面来说接口其实就是类和类之间的一种协定、一种约束。还拿上面的例子来说所有继承了 IBark 接口的类中必须实现 Bark() 方法。那么从用户使用类的用户的角度来说如果他知道了某个类是继承于 IBark 接口那么他就可以放心大胆地调用 Bark() 方法而不用管 Bark() 方法具体是如何实现的。比如我们另外写了一个类public class Cat : IBark { public Cat() { } public void Bark() { Console.WriteLine(喵喵); } }当用户用到 Cat 类或是 Dog 类的时候知道它们继承于 IBark那么不用管类里的具体实现就可以直接调用 Bark() 方法因为这两个类中肯定有关于 Bark() 方法的具体实现。六、从设计角度看接口的价值如果我们从设计的角度来看一个项目中会有若干个类需要去编写。由于这些类比较复杂工作量比较大这样每个类就需要占用一个工作人员进行编写。比如 A 程序员去定义 Dog 类B 程序员去写 Cat 类这两个类本来没什么联系的可是由于用户需要它们都实现一个关于叫的方法这就要对它们进行一种约束让它们都继承于 IBark 接口目的是方便统一管理另一个是方便调用。当然了不使用接口一样可以达到目的只不过这样的话这种约束就不那么明显。如果这样的类还有 Duck 类等等比较多的时候难免会有人漏掉这样的方法。所以说还是通过接口更可靠一些约束力更强一些。