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()

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

  • 相关阅读:
    hihocoder 1142 三分·三分求极值(三分)
    poj 3304 Segments(计算直线与线段之间的关系)
    poj 1269 Intersecting Lines(判断两直线关系,并求交点坐标)
    poj 2398 Toy Storage(计算几何 点线关系)
    poj 2318 TOYS(计算几何 点与线段的关系)
    计算几何基础(模板)
    Jmeter-基本组成
    java-面向对象
    性能测试基础
    java-多线程
  • 原文地址:https://www.cnblogs.com/lc-chenlong/p/3196693.html
Copyright © 2011-2022 走看看