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

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

  • 相关阅读:
    什么是知行动手实验室?
    SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践
    一文读懂容器存储接口 CSI
    AI 事件驱动场景 Serverless 实践
    一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目
    5G 和云原生时代的技术下半场,视频化是最大最新的确定性
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
    Knative 基于流量的灰度发布和自动弹性实践
    阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
    阿里巴巴开源容器镜像加速技术
  • 原文地址:https://www.cnblogs.com/lc-chenlong/p/3196693.html
Copyright © 2011-2022 走看看