通过笔记本配件,理解抽象类接口和委托事件
很基础的东西今天用实际场景模拟一遍,以重温抽象类和接口的区别,并同时重温一下委托和事件。
笔记本具有共性,如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
生成结果: