C# 接口的正确使用方式

前言

之前写过一个 “接口” 的笔记: 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();
        }
    }
}

七,项目目录结构

八、执行结果

后记

通过这个例子可以看出,对接口进行编程,可以做到功能块的拔插、替换,而不影响其他组件。

并且接口制定好后,对象的开发和接口的实现分离开了,可以并行开发。

发表评论