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