如何正确隐藏基本方法

时间:2015-02-24 17:22:09

标签: c# oop

我有什么

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);}

BUT:

如何组织演员或隐藏,因为这种结构没有意义

 public new UrlHelper Url { get; set; }

 Url = new CustomUrlHelper(ViewContext.RequestContext) as UrlHelper;

仅调用子构造函数,但不调用方法

UPD:基本方法Action不是virtual

1 个答案:

答案 0 :(得分:0)

认为您所寻找的只是Url = new CustomUrlHelper(ViewContext.RequestContext);

如果每个CustomViewWebPage只需要一个UrlHelper实例,那么你就会变得过于复杂。继承的好处是,孩子是父母,无论出于何种目的。在您的情况下,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)

enter image description here

编辑:这适用于.NET 4.5。如果您要隐藏而不是覆盖.NET 4,请不要使用覆盖修改器。您仍将以相同的方式调用您的方法,如果您的实现是CustomUrlHelper,那么它将调用您的自定义版本而不是基本方法。