該篇文章只是說明抽象類的一個使用場景,由於小弟水平一般,如果有說的不對地方希望各位大牛們指出,也歡迎各位親們補充。
什么是抽象類
用關鍵字abstract定義的類即為抽象類,且只能作為基類。
抽象類注意的地方
1、 用abstract定義的類不一定包含抽象方法,也可以包含非抽象方法。
2、abstract定義的方法一定包含在抽象類中。
3、抽象類不能被實例,只能被繼承並且派生類需要重寫(overriding)抽象類中的抽象方法。
4、抽象類不能定義為密封類(sealed)
5、 如果派生類沒有實現所有的抽象方法,則該派生類也必須聲明為抽象類。
實例
下面我通過一個簡單的例子說明一下抽象類的使用場景。
假入我們的系統中所有進行ajax交互的后台文件都是xxxx.ashx(一般處理文件),此時我們就可以寫一個BaseHandler的抽象類提供其他xxxx.ashx文件中的類繼承,這樣我們就可以在BaseHandler中進行統一的公共處理,如錯誤處理等,還可以讓所有的派生類都必須實現BaseHandler中的抽象方法,這樣就可以使所有的派生類看起來非常統一,有助於代碼從高層次角度進行規范,不羅嗦了上代碼。
1、BaseHandler代碼
public abstract class HandlerBase : IHttpHandler { public HttpRequest Request{get;private set;} public HttpResponse Response{get;private set;} public string Method { get; private set; } public void ProcessRequest(HttpContext context) { try { Request = context.Request; Response = context.Response; Method = Request.Form["method"]; if (string.IsNullOrWhiteSpace(Method)) { Response.Write("error"); return; } Init(context); } catch (Exception ex) { Response.Write(ex.ToString()); //記錄日志 } } /// <summary> /// 子類必須繼承重寫的方法 /// </summary> /// <param name="context"></param> public virtual void Init(HttpContext context) { } public bool IsReusable { get { return false; } } }
所有的xxx.ashx都需要繼承該類且必須要重寫抽象函數Init(HttpContext context) { }
其中method參數是每個ajax請求都必須有的,值為調用的方法名稱,對該參數的了解請繼續往下看。
2、派生類DataService.ashx
public class DataService : HandlerBase { public override void Init(HttpContext context) { Type type = this.GetType(); MethodInfo m = type.GetMethod(Method); m.Invoke(this,null); } public void HellWord() { int d = Convert.ToInt32("s1"); Response.Write("OK"); } }
method參數的值為需要調用的方法的名稱,並賦值給Method變量,通過反射根據Method的值決定調用具體的方法,這樣當方法很多時可以簡化Init中的判斷,不過可能會犧牲一些效率。
3、ajax調用DataService.ashx
<script type="text/javascript"> $.post("DataService.ashx", { "method": "HellWord" }, function (json) { alert(json) }); </script>
參數method的值說明了要調用的方法為HellWord()
讀完這篇文章希望對大家理解抽象函數有一定的幫助。歡迎大家補充更正。