我创建了一个继承自IHttpHandler
public class MyGenericHandler : IHttpHandler
{
public User user;
public void ProcessRequest(HttpContext context)
{
user = Extensions.GetUser();
}
public bool IsReusable
{
get
{
return false;
}
}
}
现在我正在创建一个继承自上面类的Generic Handler(.ashx):
<%@ WebHandler Language="C#" Class="test" %>
using System.Linq;
using System.Web;
public class test :MyGenericHandler
{
public void ProcessRequest(HttpContext context)
{
((MyGenericHandler)this).ProcessRequest(context);
context.Response.Write("test");
}
}
但代码context.Response.Write("test");
永远不会执行。但是第一类(context.Response.Write("test");
)中的那个被触发了。
答案 0 :(得分:1)
在C#中使用继承时,您需要在要覆盖的成员上使用C#关键字“virtual”和“override”。
virtual关键字用于修改方法,属性,索引器或事件声明,并允许在派生类中重写它。
override方法提供从基类继承的成员的新实现。
如果你不这样做,那么他们将改为“hidden”,而且几乎肯定不会按照你想要的方式运作。
当用作声明修饰符时,new关键字显式隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然您可以在不使用new修饰符的情况下隐藏成员,但会收到编译器警告。如果使用new来显式隐藏成员,则会抑制此警告。
这是一些类的示例,一组使用虚拟/覆盖,另一类没有。
https://dotnetfiddle.net/lEDkdr
请注意警告三角形,告诉您正在使用“隐藏”而不是覆盖。