抽象类,接口,委托与事件

抽象类:

是事物的本质,可以有属性,可以有默认实现.
可以当做共性抽象出来的.
接口:
是事务的行为,不可以有属性,也没有默认实现.
只能是行为的共性抽象出来.
委托:
类似于c中指针的概念,允许程序以方法为作为参数
事件:
是基于委托的,是对象产生的消息.具有多路广播功能.
配合委托完成多种设计模式.
比如一个带报警功能的车门,那么门的大小尺寸,厚度,车门状态是属性,开关是默认行为,开门,关门,报警都是行为.车主和小偷是开门的主体.
那么在设计的时候就应该是

public delegate string OpenDoor(); 
		/// <summary> 
		/// 门共有属性类 
		/// </summary> 
		public abstract class Door 
		{ 
		    //车门的属性在此处无用,仅为表示 
		    static int Size 
		    { 
		        get; 
		        set; 
		    } 
		    static int Thickness 
		    { 
		        get; 
		        set; 
		    } 
		    //车门状态 
		    public bool State 
		    { 
		        get; 
		        set; 
		    } 
		    //此处使用事件定义开关门方法 
		    public abstract void Open(); 
		    public abstract void Close(); 
		} 
		abstract public class ILock 
		{ 
		    public abstract bool OnLock(); 
		} 
		/// <summary> 
		/// 报警功能接口 
		/// </summary> 
		public interface IAlarm 
		{ 
		    void Alarm(); 
		} 
		public class CarLock : ILock 
		{ 
		    public override bool OnLock() 
		    { 
		        return true; 
		    } 
		} 
		/// <summary> 
		/// 带有报警功能的车门 
		/// </summary> 
		public class CarDoor : Door, IAlarm 
		{ 
		    public string myowner; 
		    //开门者 
		    public event OpenDoor opener; 
		    public CarDoor() 
		    { 
		        this.myowner = "CarOwner"; 
		    } 
		    /// <summary> 
		    /// 开门的时候智能车门会辨别车主名字,这里假设贼和车主都报真名^^ 
		    /// </summary> 
		    public override void Open() 
		    { 
		        if (opener != null) 
		        { 
		            if (State) 
		            { 
		                return; 
		            } 
		            foreach (OpenDoor temp in opener.GetInvocationList()) 
		            { 
		                string ot = temp(); 
		                if (ot != myowner) 
		                { 
		                    Alarm(); 
		                    return; 
		                } 
		                Console.WriteLine(temp()); 
		            } 
		            State = true; 
		        } 
		    } 
		    public override void Close() 
		    { 
		        State = false; 
		    } 
		    #region IAlarm 成员 
		    public void Alarm() 
		    { 
		        Console.WriteLine(" 报警方式: tel to 110 !"); 
		    } 
		    #endregion 
		} 
		public class Main 
		{ 
		    Thief thief = new Thief(); 
		    CarOwner carowner = new CarOwner(); 
		    public Main() 
		    { 
		        CarDoor cardoor = new CarDoor(); 
		        //监听贼开车门 
		        cardoor.opener += new OpenDoor(thief.OpenDoor); 
		        //监听车主开门 
		        cardoor.opener += new OpenDoor(carowner.OpenDoor); 
		        cardoor.Open(); 
		    } 
		} 
		/// <summary> 
		/// 抽象的人 
		/// </summary> 
		public abstract class IPeople 
		{ 
		    public string Name; 
		    public string OpenDoor() 
		    { 
		        return this.Name; 
		    } 
		} 
		/// <summary> 
		/// 偷车贼 
		/// </summary> 
		public class Thief : IPeople 
		{ 
		    public Thief() 
		    { 
		        this.Name = "Thief"; 
		    } 
		} 
		/// <summary> 
		/// 车主 
		/// </summary> 
		public class CarOwner : IPeople 
		{ 
		    public CarOwner() 
		    { 
		        this.Name = "CarOwner"; 
		    } 
		} 

实现的是一个抽象类,一个接口,而不是一个抽象类三个接口.因为开门和关门都是车门的共性,而报警器功能则不是每个门都有的.

车门会判断车主的名称,如果不是车主就会触发报警.所以将开门的人设置为车门监听的对象.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据