CH10-接口

本章目标

  1. 掌握接口基础知识
  2. 掌握接口作为一种约定和能力的含义
  3. 会使用接口实现编程

本章内容

1、接口的概念

  1. 为什么要使用接口?

    问题:通过OOP思想,实现防盗门的功能

    分析:

    1. 门有“开”和“关”的功能,锁有“上锁”和“开锁”的功能
    2. 将门和锁分别定义为抽象类

    思考问题:防盗门可以继承门的同时又继承锁吗?如何解决此问题

    1、提出需求,带领学员分析如何实现

    2、按之前所学无法合理解决问题,不能让防盗门继承门的同时又继承锁,

    原因两点:

    第一,防盗门不是锁,不符合继承中is a的关系;

    第二,C#只支持单继承。

    3、说明解决办法,通过接口方可实现

    1721811316056

  2. 什么是接口?

    1. 语法:

      1
      2
      3
      4
      5
      6
      7
      [修饰符] interface 接口名 : 父接口1,父接口2, …… {
      属性定义
      方法定义
      }
      class 类名 : 父类名,接口1,接口2, …… {

      }
    2. 示例:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      //定义USB接口
      public interface UsbInterface
      {
      void Service ();
      }
      //实现类,实现接口
      public class UDisk : UsbInterface
      {
      public void service()
      {
      Console.WriteLine("连接USB口,开始传输数据。");
      }
      }
    3. 接口的特征:

      1. 接口不可以被实例化

        1721812494032

      2. 实现类必须实现接口的所有方法

        1721812589204

      3. 实现类可以实现多个接口

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

      5. 不允许声明成员上的修饰符,即使是public也不可以,因为接口成员总是公有的,也不能声明为虚拟的和静态的

        1721812947776

  3. 演示案例:用程序描述USB接口

    1. 效果图:

      1721813146956

    2. 实现接口三步骤:

      1. 编写接口

        1
        2
        3
        4
        5
        6
        7
        public interface IUsb
        {
        /// <summary>
        /// 提供接口服务
        /// </summary>
        void Service();
        }

        经验:

        通常情况下,在C#中定义接口命名以I开头,例如:IUsb

      2. 实现接口

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        public class UsbDisk : IUsb
        {
        public void Service()
        {
        Console.WriteLine("连接USB接口,开始传递数据....");
        }
        }
        public class UsbFan : IUsb
        {
        public void Service()
        {
        Console.WriteLine("连接USB接口,开始吹出凉凉的风....");
        }
        }
      3. 多态方式使用接口

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        static void Main(string[] args)
        {
        IUsb usb1 = new UsbDisk();
        usb1.Service();

        IUsb usb2 = new UsbFan();
        usb2.Service();

        Console.ReadKey();
        }

2、案例讲解:接口实现防盗门

  1. 分析:

    1. 防盗门是一个门:is-a关系,通过继承实现
    2. 防盗门有一个锁:锁有开锁和关锁的能力,通过接口实现
  2. 代码演示:

    1. 定义门的父类,实现开,关门功能

      1
      2
      3
      4
      5
      public abstract class Door
      {
      public abstract void Open();
      public abstract void Close();
      }
    2. 定义锁的接口,定义开锁和关锁的接口

      1
      2
      3
      4
      5
      public interface ILock
      {
      void LockUp();//关锁
      void OpenLock();//开锁
      }
    3. 创建防盗门,继承Door,实现接口ILock

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      public class TheftproofDoor : Door, ILock
      {
      public override void Close()
      {
      Console.WriteLine("轻轻一拉,门关上了....");
      }
      public override void Open()
      {
      Console.WriteLine("用力一推,门打开了....");
      }
      public void LockUp()
      {
      Console.WriteLine("插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。");
      }
      public void OpenLock()
      {
      Console.WriteLine("插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙。");
      }
      }
    4. 测试类:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      static void Main(string[] args)
      {
      TheftproofDoor door = new TheftproofDoor();
      door.OpenLock();
      door.Open();
      door.Close();
      door.LockUp();

      Console.ReadKey();
      }
    5. 演示结果 :

      1721815077062

3、扩展防盗门门铃功能,主要是实现拍照存档

  1. 效果图如下:

    1721815278771

  2. 添加门铃接口

    1
    2
    3
    4
    5
    6
    7
    /// <summary>
    /// 接口:门铃功能,按门铃实现拍照功能
    /// </summary>
    public interface IDoorBell
    {
    void TakePictures();//拍照功能
    }
  3. 在防盗门上实现多个接口,修改如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    public class TheftproofDoor : Door, ILock,IDoorBell
    {
    public override void Close()
    {
    Console.WriteLine("轻轻一拉,门关上了....");
    }
    public override void Open()
    {
    Console.WriteLine("用力一推,门打开了....");
    }
    public void LockUp()
    {
    Console.WriteLine("插进钥匙,向左旋转钥匙三圈,锁上了,拔出钥匙。");
    }
    public void OpenLock()
    {
    Console.WriteLine("插进钥匙,向右旋转钥匙三圈,锁打开了,拔出钥匙。");
    }

    public void TakePictures()
    {
    Console.WriteLine("叮咚......咔嚓,,,拍摄相片成功....");
    }
    }
  4. 测试类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static void Main(string[] args)
    {
    TheftproofDoor door = new TheftproofDoor();
    door.TakePictures();
    door.OpenLock();
    door.Open();
    door.Close();
    door.LockUp();

    Console.ReadKey();
    }
  5. 效果如下:

    1721815646197

本章总结

  1. 理解接口的概念
  2. 可以通过接口实现具体功能

本章作业

  1. 通过继承和接口,实现演示案例防盗门功能

  2. 使用接口实现手机功能

    1. 需求说明:

      原始的手机,可以发短信,通电话。

      智能手机:随着发展,手机增加了功能:音频、视频播放、拍照、上网

    2. 实现思路:

      1. 编写类及接口,参照以下类的结构图
      2. 编写测试类,让普通手机播放音频、发信息和通电话,让智能手机上网、播放视频、照相、发信息和通电话

    1721815931175

  3. 开发打印机

    1. 需求说明:

      1. 墨盒:彩色、黑白
      2. 纸张类型:A4、B5
      3. 墨盒和纸张都不是打印机厂商提供的
      4. 打印机厂商要兼容市场上的墨盒、纸张
    2. 具体分析:

      1. 墨盒和纸张的规格是一种约定
      2. 打印机需要遵守这些约定
      3. 用面向接口编程的方式开发
        1. 制定墨盒、纸张的约定或标准
        2. 打印机厂商使用墨盒、纸张的标准开发打印机
        3. 其他厂商按照墨盒、纸张的标准生产墨盒、纸张
    3. 实现思路

      1. 定义墨盒接口InkBox和定义纸张接口Paper

      2. 定义打印机类 ,实现两个接口

      3. 组装打印机

        1721816269853

  4. 组装一台计算机

    1. 需求说明:

      1. 采用面向接口编程思想组装一台计算机。
      2. 计算机的主要组成部分有:CPU、硬盘、内存
    2. 实现思路:

      1. 定义CPU的接口CPU,返回CPU品牌和主频
      2. 定义内存的接口EMS,返回容量
      3. 定义硬盘的接口HardDisk,返回容量
      4. 编写各组件厂商分别实现CPU、EMS、和HardDisk接口编写计算机类,组装计算机并显示相关信息
      5. 编写测试类运行
    3. 效果图:

      1721816437545