假如很多人要買水果吃,吃的動作只有一個,但是有的人要用現金買,有的人用信用卡,有的人賒帳。要為每個人定義一個類,就要定義多個相同的吃的方法。如果定義一個抽象類,在里面實現吃的方法,再做一個買的抽象方法。那每個人的類都從這個抽象類派生下來,只要實現買的方法即可,吃的方法就可以直接用父類的方法了。如果要改吃的方法就不用改多個,只要改這個抽象類里的就行了。
一個接口:
public interface IGrabber { /// <summary> /// 是否可用。 /// </summary> bool Enabled { get; set; } /// <summary> /// 抓取器名。 /// </summary> string Name { get; set; } /// <summary> /// 源字符串最大長度。 /// </summary> uint MaxSourceLength { get; set; } /// <summary> /// 源字符串最小長度。 /// </summary> uint MinSourceLength { get; set; } /// <summary> /// 抓取。 /// </summary> /// <param name="source">要抓取的源。</param> /// <param name="target">抓取結果。</param> /// <returns>是否抓取成功。</returns> bool Grab(string source, out string[] targets); /// <summary> /// 抓取。 /// </summary> /// <param name="source">要抓取的源。</param> /// <param name="targets">抓取結果。</param> /// <returns></returns> bool Grab(IList<Keys> source, out string[] targets)
一個抽象類:
public abstract class BaseGrabber : IGrabber { #region IGrabber成員。 public virtual bool Enabled { get; set; } public virtual string Name { get; set; } public virtual uint MaxSourceLength { get; set; } public virtual uint MinSourceLength { get; set; } public abstract bool Grab(string source, out string[] targets); public abstract bool Grab(IList<Keys> source, out string[] targets); #endregion /// <summary> /// 是否重構數據源(識別方向鍵、刪除鍵等按鍵對輸入字符的影響,返回真實的輸入項)。 /// </summary> public virtual bool IsRestructured { get; set; } PRotected BaseGrabber() { this.Name = this.GetType().Name; this.MinSourceLength = 0; this.MaxSourceLength = 256; this.Enabled = true; this.IsRestructured = true; } /// <summary> /// 重構數據源(識別方向鍵、刪除鍵等按鍵對輸入字符的影響,返回真實的輸入項)。 /// </summary> /// <param name="source"></param> /// <returns></returns> public virtual string RestructureSource(string source) { return source; } /// <summary> /// 重構數據源(識別方向鍵、刪除鍵等按鍵對輸入字符的影響,返回真實的輸入項)。 /// </summary> /// <param name="source"></param> /// <returns></returns> public virtual IList<Keys> RestructureSource(IList<Keys> source) { int count = source.Count; for (int i = 0; i < count; i++) { Keys key = source[i]; switch (key) { case Keys.Back: source.RemoveAt(i); source.RemoveAt(i - 1); i -= 2; count -= 2; break; } } return source; }
終于搞明白了,還是上面那個例子說的是在。從接口到抽象類,在從抽象類到類,在類到對象。這就是面向對象。
下面是有關抽象類的一些基本感念:
抽象類與抽象方法由abstract修飾
抽象方法沒有方法體
抽象類的派生類必須實現抽象方法體
抽象類只能作為基類,無法實例化。
重點就在于無法實例化,而且為了代碼的清晰度,方便以后修改。
新聞熱點
疑難解答