抽象類總結及練習


該篇文章只是說明抽象類的一個使用場景,由於小弟水平一般,如果有說的不對地方希望各位大牛們指出,也歡迎各位親們補充。

什么是抽象類

用關鍵字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()

讀完這篇文章希望對大家理解抽象函數有一定的幫助。歡迎大家補充更正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM