抽象类总结及练习

该篇文章只是说明抽象类的一个使用场景,由于小弟水平一般,如果有说的不对地方希望各位大牛们指出,也欢迎各位亲们补充。

什么是抽象类

用关键字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()

读完这篇文章希望对大家理解抽象函数有一定的帮助。欢迎大家补充更正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券