通过笔记本配件,理解抽象类接口和委托事件

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

    笔记本具有共性,如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

生成结果:

 

posted @ 2012-06-30 21:02  PongorXi  阅读(650)  评论(2编辑  收藏  举报