如何正确隐藏基方法
How to correctly hide base method
我有什么
public abstract class CustomWebViewPage<T> : WebViewPage<T>
{
public new CustomUrlHelper Url { get; set; }
public UrlHelper UUrl { get; set; }
public override void InitHelpers()
{
Url = new CustomUrlHelper(ViewContext.RequestContext);
UUrl = new UrlHelper(ViewContext.RequestContext);
}
}
public class CustomUrlHelper : UrlHelper
{
public CustomUrlHelper(RequestContext requestContext) : base(requestContext)
{
}
public CustomUrlHelper(RequestContext requestContext, RouteCollection routeCollection) : base(requestContext, routeCollection)
{
}
public string Action(string actionName)
{
return this.GenerateUrl(null, actionName, null, null);
}
}
需要这样写条件
if (true){Url = new CustomUrlHelper(ViewContext.RequestContext);}
else{Url = new UrlHelper(ViewContext.RequestContext);}
但是:
如何组织 cast 或 hides,因为这种构造没有意义
public new UrlHelper Url { get; set; }
Url = new CustomUrlHelper(ViewContext.RequestContext) as UrlHelper;
只调用子构造函数而不调用方法
UPD:基本方法 Action
不是 virtual
我认为你要找的只是Url = new CustomUrlHelper(ViewContext.RequestContext);
如果您只需要每个 CustomViewWebPage 的一个 UrlHelper 实例,那么您已经把它弄得太复杂了。继承的好处是 child 是一个 parent,对于所有意图和目的。在您的情况下,CustomUrlHelper 是一个 UrlHelper,因此您不需要两者。使用这个:
public abstract class CustomWebViewPage<T> : WebViewPage<T>
{
public UrlHelper Url { get; set; }
public override void InitHelpers()
{
if (true){Url = new CustomUrlHelper(ViewContext.RequestContext);}
else{Url = new UrlHelper(ViewContext.RequestContext);}
}
}
您不需要将 CustomUrlHelper
转换为 UrlHelper
,因为它已经是一个(通过继承)。
您还应该将新 Action 方法的签名更改为 public override string Action(string actionName)
。
编辑:这适用于 .NET 4.5。如果您希望隐藏而不是覆盖 .NET 4,请不要使用覆盖修饰符。您仍然会以相同的方式调用您的方法,如果您的实现是 CustomUrlHelper,那么它将调用您的自定义版本而不是基本方法。
我有什么
public abstract class CustomWebViewPage<T> : WebViewPage<T>
{
public new CustomUrlHelper Url { get; set; }
public UrlHelper UUrl { get; set; }
public override void InitHelpers()
{
Url = new CustomUrlHelper(ViewContext.RequestContext);
UUrl = new UrlHelper(ViewContext.RequestContext);
}
}
public class CustomUrlHelper : UrlHelper
{
public CustomUrlHelper(RequestContext requestContext) : base(requestContext)
{
}
public CustomUrlHelper(RequestContext requestContext, RouteCollection routeCollection) : base(requestContext, routeCollection)
{
}
public string Action(string actionName)
{
return this.GenerateUrl(null, actionName, null, null);
}
}
需要这样写条件
if (true){Url = new CustomUrlHelper(ViewContext.RequestContext);}
else{Url = new UrlHelper(ViewContext.RequestContext);}
但是:
如何组织 cast 或 hides,因为这种构造没有意义
public new UrlHelper Url { get; set; }
Url = new CustomUrlHelper(ViewContext.RequestContext) as UrlHelper;
只调用子构造函数而不调用方法
UPD:基本方法 Action
不是 virtual
我认为你要找的只是Url = new CustomUrlHelper(ViewContext.RequestContext);
如果您只需要每个 CustomViewWebPage 的一个 UrlHelper 实例,那么您已经把它弄得太复杂了。继承的好处是 child 是一个 parent,对于所有意图和目的。在您的情况下,CustomUrlHelper 是一个 UrlHelper,因此您不需要两者。使用这个:
public abstract class CustomWebViewPage<T> : WebViewPage<T>
{
public UrlHelper Url { get; set; }
public override void InitHelpers()
{
if (true){Url = new CustomUrlHelper(ViewContext.RequestContext);}
else{Url = new UrlHelper(ViewContext.RequestContext);}
}
}
您不需要将 CustomUrlHelper
转换为 UrlHelper
,因为它已经是一个(通过继承)。
您还应该将新 Action 方法的签名更改为 public override string Action(string actionName)
。
编辑:这适用于 .NET 4.5。如果您希望隐藏而不是覆盖 .NET 4,请不要使用覆盖修饰符。您仍然会以相同的方式调用您的方法,如果您的实现是 CustomUrlHelper,那么它将调用您的自定义版本而不是基本方法。