Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web表单和通用处理程序(ashx文件)是否可以共享一个共同的祖先类(或基页)?_Asp.net_Inheritance_Handler_Ashx - Fatal编程技术网

Asp.net web表单和通用处理程序(ashx文件)是否可以共享一个共同的祖先类(或基页)?

Asp.net web表单和通用处理程序(ashx文件)是否可以共享一个共同的祖先类(或基页)?,asp.net,inheritance,handler,ashx,Asp.net,Inheritance,Handler,Ashx,如果有一个ASP.net网站,它的web表单都继承自一个公共的基页,该基页检查身份验证和会话过期时重定向等内容,那么有没有办法在ashx处理程序中使用这个基类?我开始在处理程序中继承基页类,并意识到这可能不是推荐的做法。有没有关于如何避免代码重复的想法 这个可以吗 public class FooHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { 变成这样 public class

如果有一个ASP.net网站,它的web表单都继承自一个公共的基页,该基页检查身份验证和会话过期时重定向等内容,那么有没有办法在ashx处理程序中使用这个基类?我开始在处理程序中继承基页类,并意识到这可能不是推荐的做法。有没有关于如何避免代码重复的想法

这个可以吗

public class FooHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
变成这样

public class FooHandler : BasePageClass, IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
我得到以下警告,这正是我重新考虑我所做的事情的原因:

ProcessRequest(System.Web.HttpContext) 隐藏继承的成员 System.Web.UI.Page.ProcessRequest(System.Web.HttpContext)。 要覆盖该实现,请添加 覆盖关键字。否则添加 新关键字


您现在发现了为什么OO大师类型总是选择组合而不是继承。无论如何,完全按照您想要的方式进行操作是相当棘手的,因为尽管System.Web.UI.Page实现了IHttpHandler(如果我没记错的话),但要返回到您自己的处理程序,有很多内部处理是无法克服的


最简单的修复方法是尝试将尽可能多的函数从monster base page类移到它们自己的类中——或者更好的方法是将IHTTP模块移到它们自己的类中,在这些类中处理诸如会话过期之类的内容是有意义的——以便将事情解耦。

您现在发现了为什么OO专家类型总是投票支持组合而不是继承。无论如何,完全按照您想要的方式进行操作是相当棘手的,因为尽管System.Web.UI.Page实现了IHttpHandler(如果我没记错的话),但要返回到您自己的处理程序,有很多内部处理是无法克服的


最简单的修复方法是尝试将尽可能多的函数从monster base page类移到它们自己的类中——或者更好的方法是将IHTTP模块移到它们自己的类中,在这些类中处理诸如会话过期之类的内容是有意义的——以便将事情解耦。

如果将父类ProcessRequest设置为虚拟,则可以在子类中重写它,然后从重写的方法内部调用基类方法

public abstract class ParentHandler : IHttpHandler, IRequiresSessionState
{
    protected WebConnectHandler Context;

    public virtual void ProcessRequest(HttpContext context)
    {
        Context = new WebConnectHandler(context);
    }

    //...
}

//...
public class ChildHandler : ParentHandler
{
    public override void ProcessRequest(HttpContext context)
    {
        base.ProcessRequest(context);
        //the rest of your code
    }
}
//...

如果将父类ProcessRequest设置为虚拟,则可以在子类中重写它,并从重写的方法内部调用基类方法

public abstract class ParentHandler : IHttpHandler, IRequiresSessionState
{
    protected WebConnectHandler Context;

    public virtual void ProcessRequest(HttpContext context)
    {
        Context = new WebConnectHandler(context);
    }

    //...
}

//...
public class ChildHandler : ParentHandler
{
    public override void ProcessRequest(HttpContext context)
    {
        base.ProcessRequest(context);
        //the rest of your code
    }
}
//...