zoukankan      html  css  js  c++  java
  • 抽象类总结及练习

    抽象类总结及练习

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

    什么是抽象类

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

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

     
     
     
    标签: 抽象类
  • 相关阅读:
    HUST 1372 marshmallow
    HUST 1371 Emergency relief
    CodeForces 629D Babaei and Birthday Cake
    CodeForces 629C Famil Door and Brackets
    ZOJ 3872 Beauty of Array
    ZOJ 3870 Team Formation
    HDU 5631 Rikka with Graph
    HDU 5630 Rikka with Chess
    CodeForces 626D Jerry's Protest
    【POJ 1964】 City Game
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3197663.html
Copyright © 2011-2022 走看看