zoukankan      html  css  js  c++  java
  • 通过笔记本配件,理解抽象类接口和委托事件

        很基础的东西今天用实际场景模拟一遍,以重温抽象类和接口的区别,并同时重温一下委托和事件。

        笔记本具有共性,如CPU、主板、内存、硬盘等,这些共性正好用abstract去定义,因为这是每台笔记本必须具备的固件。也具有个性,比如提供USB接口、串口等,供外部设备使用,这个接口正好用interface去定义。

        我在定义笔记本抽象基类的时候,将笔记本的不可变的部分用常规方法定义(如代码中Discription方法),将可变部分用抽象方法定义(抽象方法:指定一个方法而不指定其代码主体,方法的实际实现在派生类中,派生类中必须重写抽象基类中的抽象方法)。

        笔记本向外部提供了接口,如USB接口,然而外部设备想通过USB连接到笔记本,必须实现专门为笔记本定义的IUsb接口。为何此处要用接口,因为我不管将来何种设备想连接到笔记本,必须要遵守USB接口规范,即必须实现IUsb接口,外部设备根本不具备笔记本的一些同性,如果硬要外部设备继承笔记本抽象基础就极不恰当了。

    定义委托

    View Code
    1 /// <summary>
    2     /// 定义委托,供插入USB接口事件使用
    3     /// </summary>
    4     /// <param name="equipmentName">设备名称</param>
    5     public delegate void USBHandleDelegate(string equipmentName);

    定义笔记本抽象基类

    View Code
     1 //定义笔记本抽象基类
     2     public abstract class Computer
     3     {
     4         public void Discription()
     5         {
     6             Console.WriteLine("******************我是笔记本!******************");
     7         }
     8 
     9         public abstract void CPU();
    10         public abstract void Memory();
    11         public abstract void Mainboard();
    12         public abstract void HDD();
    13     }

    定义USB接口

    View Code
    1 //定义USB接口
    2     public interface IUsb
    3     {
    4         //USB接口规范
    5         string USBNorm();
    6     }

    定义实现USB接口的移动硬盘

    View Code
     1 //定义实现USB接口的移动硬盘
     2     class MobileHDD: IUsb
     3     {
     4         //实现USB接口方法
     5         public string USBNorm()
     6         {
     7             return "我是移动硬盘,笔记本正在往我空间里存储数据......";
     8         }
     9 
    10         //注册事件方法
    11         public void Connection(string name)
    12         {
    13             Console.WriteLine("我是【" + name + "】,我被连接到笔记本了!");
    14         }
    15     }

    定义实现USB接口的U盘

    View Code
     1 //定义实现USB接口的U盘
     2     class U_Disk:IUsb
     3     {
     4         //实现USB接口方法
     5         public string USBNorm()
     6         {
     7             return "我是U盘,笔记本正在往我空间里存储数据......";
     8         }
     9 
    10         //注册事件方法
    11         public void Connection(string name)
    12         {
    13             Console.WriteLine("我是【" + name + "】,我被连接到笔记本了!");
    14         }
    15     }

    定义继承笔记本抽象基类的Dell笔记本

    View Code
     1 //定义继承笔记抽象基类的Dell笔记本
     2     class Dell:Computer
     3     {
     4         //定义事件。当插入移动设备时触发
     5         public event USBHandleDelegate InUSB;//插入USB插槽事件
     6 
     7         //触发事件方法
     8         public void OnInUSB(string equipmentName)
     9         {
    10             if (InUSB != null)
    11             {
    12                 InUSB(equipmentName);
    13             }
    14         }
    15 
    16         //常规方法
    17         public void Brand()
    18         {
    19             Console.WriteLine("我是Dell!");
    20         }
    21 
    22         //重写抽象方法
    23         public override void CPU()
    24         {
    25             Console.WriteLine("我是【AMD 速龙II X4】CPU!");
    26         }
    27         public override void Memory()
    28         {
    29             Console.WriteLine("我是【三星DDR3】内存!");
    30         }
    31         public override void Mainboard()
    32         {
    33             Console.WriteLine("我是【华硕X79系】主板!");
    34         }
    35         public override void HDD()
    36         {
    37             Console.WriteLine("我是【希捷Barracuda 7200转系】硬盘!");
    38         }
    39         public void USBInterface(IUsb usb)
    40         {
    41             Console.WriteLine(usb.USBNorm());
    42         }
    43     }

    定义继承笔记本抽象基类的Lenove笔记本

    View Code
     1 //定义继承笔记抽象基类的Lenove笔记本
     2     class Lenove:Computer
     3     {
     4         //定义事件。当插入移动设备时触发
     5         public event USBHandleDelegate InUSB;//插入USB插槽事件
     6 
     7         //触发事件方法
     8         public void OnInUSB(string equipmentName)
     9         {
    10             if (InUSB != null)
    11             {
    12                 InUSB(equipmentName);
    13             }
    14         }
    15 
    16         //常规方法
    17         public void Brand()
    18         {
    19             Console.WriteLine("我是Lenove!");
    20         }
    21 
    22         //重写抽象方法
    23         public override void CPU()
    24         {
    25             Console.WriteLine("我是【英特尔酷睿i7】CPU!");
    26         }
    27         public override void Memory()
    28         {
    29             Console.WriteLine( "我是【金士顿DDR3】内存!");
    30         }
    31         public override void Mainboard()
    32         {
    33             Console.WriteLine( "我是【七彩虹战斧】主板!");
    34         }
    35         public override void HDD()
    36         {
    37             Console.WriteLine( "我是【日立Touro Mobile系】硬盘!");
    38         }
    39         public void USBInterface(IUsb usb)
    40         {
    41             Console.WriteLine(usb.USBNorm());
    42         }
    43     }

    生成Dell和Lenove笔记本,并使用USB接口

    View Code
     1 class CreateComputer
     2     {
     3         static void Main(string[] args)
     4         {
     5             //使用Dell电脑
     6             Dell dell = new Dell();
     7             dell.Discription();
     8             dell.Brand();
     9             dell.CPU();
    10             dell.Memory();
    11             dell.Mainboard();
    12             dell.HDD();
    13             //将移动硬盘通过USB连接到电脑
    14             MobileHDD mobileHDD = new MobileHDD();
    15             dell.InUSB += mobileHDD.Connection;
    16             dell.OnInUSB("移动硬盘");
    17             //通过接口与移动硬盘交互
    18             dell.USBInterface(mobileHDD);
    19 
    20             Console.WriteLine();
    21 
    22             //使用Lenove电脑
    23             Lenove lenove = new Lenove();
    24             lenove.Discription();
    25             lenove.Brand();
    26             lenove.CPU();
    27             lenove.Memory();
    28             lenove.Mainboard();
    29             lenove.HDD();
    30             //将U盘通过USB连接到电脑
    31             U_Disk u_disk = new U_Disk();
    32             lenove.InUSB += u_disk.Connection;
    33             lenove.OnInUSB("U盘");
    34             //通过接口与U盘交互
    35             dell.USBInterface(u_disk);
    36             Console.Read();
    37         }
    38     }

    以上用到了事件委托,如何您对事件委托理解还不够深入,请仔细反复阅读张子阳老师的文章,相信您只要认真阅读会完全理解。

    http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html

    生成结果:

  • 相关阅读:
    RabbitMQ插件安装
    RabbitMQ安装与初始配置
    Spring Boot教程(四十二)LDAP来管理用户信息(2)
    Spring Boot教程(四十一)LDAP来管理用户信息(1)
    Spring Boot教程(四十)使用Flyway来管理数据库版本
    Spring Boot教程(三十九)使用MyBatis注解配置详解(2)
    Spring Boot教程(三十八)使用MyBatis注解配置详解(1)
    Spring Boot教程(三十七)整合MyBatis
    Spring Boot教程(三十六)使用MongoDB数据库(2)
    Spring Boot教程(三十五)使用MongoDB数据库(1)
  • 原文地址:https://www.cnblogs.com/PongorXi/p/2571329.html
Copyright © 2011-2022 走看看