该篇文章只是说明抽象类的一个使用场景,由于小弟水平一般,如果有说的不对地方希望各位大牛们指出,也欢迎各位亲们补充。
什么是抽象类
用关键字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()
读完这篇文章希望对大家理解抽象函数有一定的帮助。欢迎大家补充更正。