前言
之前写过一个 “接口” 的笔记: https://www.runner.ink/2018/08/04/csharp-interface/
里面记录了对 “接口” 这一语法的基本规则和用途,随着码龄的增长,对 “接口“ 这一基本语法有了新的认识和理解。
大学的时候学的是嵌入式,用 C 语言,面向过程编程,导致我用了很长时间才对 “面向对象” 有所顿悟。
对接口进行编程
一,确认场景
我们需要一台复印机,这个复印机有一个功能:复印。
二、分析对象
创建一个复印机对象,“复印” 这个功能可以分为两个动作:读取数据、打印数据。
这两个动作可以交给两个模块完成:读取器、打印器。
三、制定接口
读取器和打印器有很多种规格,为了模块可插拔、可替换,我们要先制定接口,只要符合接口规则,就能插到复印机用。
就跟U盘和移动硬盘一样,都是存储工具,只要符合 USB3.0 的规则,就能插到电脑的 USB 3.0 接口上用。
读取接口:
namespace Interface_test.Interface { interface IReader { string Read(); } }
打印接口:
namespace Interface_test.Interface { interface IWriter { void Write(string data); } }
四、实现接口(这里我们准备一种读取器,两种打印器)
//读取器
using Interface_test.Interface; using System; namespace Interface_test.Implement { class Reader: IReader { public string Read() { return Console.ReadLine(); } } }
//Hp 打印器
using Interface_test.Interface; using System; namespace Interface_test.Implement { class HpWriter: IWriter { public void Write(string data) { Console.WriteLine("HP Write: " + data); } } }
//Dell 打印器
using Interface_test.Interface; using System; namespace Interface_test.Implement { class DellWriter: IWriter { public void Write(string data) { Console.WriteLine("Dell Write: " + data.ToUpper()); } } }
五、创建对象(创建对象可以和实现接口同时进行)
有了接口,就可以快速的组装一台打印机:
using Interface_test.Interface; namespace Interface_test { class Duplicator { //注意看下面这个方法,参数是接口(形参) public void Copy(IReader reader,IWriter writer) { writer.Write(reader.Read()); } } }
六,使用对象
打印机的模型有了,实例化出来用就好了:
using Interface_test.Implement; using System; namespace Interface_test { class Program { static void Main(string[] args) { Duplicator duplicator = new Duplicator(); Console.Write("Input: "); //注意看下面这句话,参数是接口的实现(实参) duplicator.Copy(new Reader(),new HpWriter()); Console.Write("Input: "); //换个打印器 duplicator.Copy(new Reader(), new DellWriter()); Console.ReadLine(); } } }
七,项目目录结构
八、执行结果
后记
通过这个例子可以看出,对接口进行编程,可以做到功能块的拔插、替换,而不影响其他组件。
并且接口制定好后,对象的开发和接口的实现分离开了,可以并行开发。