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