【问题标题】:Accessing a private method in a overridden public method在重写的公共方法中访问私有方法
【发布时间】:2018-12-21 14:18:17
【问题描述】:

我目前在从覆盖的公共方法访问私有方法时遇到一些问题。

我的情况是这样的:我有一个编译的 .dll 文件,它基本上由这个组成

public class OriginalHandler
{
    public virtual void Request()
    {
        RedirectIfConditionIsFulfilled()
        this.PeformRequest()    
    } 


    protected virtual bool PeformRequest()
    {

    }

    private static void RedirectIfConditionIsFulfilled()
    {

    }

}

我需要更改方法PeformRequest(),所以我创建了一个公共类,它继承OriginalHandler并重写该方法:

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

}

为确保此方法不违反“影响”范围,我必须确保仅在某些网站上对其进行评估, 我们使用它来确保 HttpRequestProcess 只影响使用它的所需站点

namespace Sitecore.Sharedsource.Pipelines.HttpRequest
{
    using System.Collections.Generic;

    using Assert = Sitecore.Diagnostics.Assert;
    using S = Sitecore;

    public abstract class SiteSpecificHttpRequestProcessor: S.Pipelines.HttpRequest.HttpRequestProcessor
    {
            public abstract List<string> _sites;


            public sealed override void Process(S.Pipelines.HttpRequest.HttpRequestArgs args)
            {
                Assert.ArgumentNotNull(args, "args");

                if (S.Context.Site == null || !this._sites.FirstOrDefault(S.Context.Site.Name))
                {
                    return;
                }

                this.DoProcess(args, this._sites.FirstOrDefault(S.Context.Site.Name));
            }

        protected abstract void DoProcess(S.Pipelines.HttpRequest.HttpRequestArgs args, string);
    }
}

所以包括我的ModifiedOriginalHandler 来包括这个

 public class SiteSpecificModifiedOriginalHandler: SiteSpecificHttpRequestProcessor
 {
Public override List<String> _sites => new[]
{
    "www.only.com"  , "www.boat.com"
};


public virtual HttpContext GetHttpContext()
    {
        return HttpContext.Current;
    }

    public override void DoProcess(HttpRequestArgs args, string)
    {
        var mediaRequest = new ModifiedOriginalHandler ();
        var context = GetHttpContext();
    var site = Sitecore.Context.Site;

        if (site == null)
        {
            return;
        }

        if (string != null)
        {
            mediaRequest.Request(context);
        }
        else
        {
            OriginalHandler baseClass = mediaRequest;
            baseClass.Request(context);
        }
    }
 }

这是我遇到问题的地方,我可以从 SiteSpecificModifiedOriginalHandler 不调用受保护的方法PeformRequest
但可以调用公共方法Request,它在内部调用所需的函数,所以我做了一个覆盖函数, 确保不是调用原始版本而是调用我的修改版本

public class ModifiedOriginalHandler : OriginalHandler 
{

    protected override bool PeformRequest()
    {

    }

    public override void Request()
    {
        RedirectIfConditionIsFulfilled()
        this.PeformRequest()    
    }        
}

这是我遇到问题的地方,RedirectIfConditionIsFulfilled 是一个私有方法, 我不能这样调用这个方法。我可以在我的重写函数中删除这个调用,但这会 要求删除RedirectIfConditionIsFulfilled,这会改变原来的功能,我不想这样做。

那么我该如何克服呢?

如何在被覆盖的公共方法中访问私有方法?

【问题讨论】:

  • 如果您希望能够从继承的类中访问它,为什么不使用protected 而不是private?这就是它的用途。
  • 有很多代码需要通读...如果您可以压缩它而不丢失任何非常有用的关键信息。另外,您可能想阅读:stackoverflow.com/help/mcve
  • @DaveInCaz 这应该是一个漂亮的 MVCE,我试图解释我是如何以及为什么最终得到我的解决方案的......
  • 如果您的问题基本上是“我如何在被覆盖的公共方法中访问私有方法?”那么剩下的基本上就是上下文了;上下文解释了您为什么需要它,但它是特定技术要求的附属品。它越容易阅读,您可能会收到更多/更好的答案。 (也就是说,你得到了一些答案:))

标签: c# inheritance overriding access-levels


【解决方案1】:

如果您有权访问OriginalHandler 实现,则将派生类设为嵌套类:

class A {
    private void Foo() { }
    protected virtual void Bar() { }

    public class B: A {
        protected override void Bar() {
            Foo(); \\ legal } } }

如果您不这样做,那么禁止反射,则无法从外部类型访问另一种类型的私有成员。

【讨论】:

  • 我刚刚在我的 ModifiedOriginalhandler 中重新实现了相同的方法
  • 不知道为什么要在 Private 开始实施,它应该是受保护的。
  • @Anita 问谁实现了这个方法,他应该比任何人都清楚。假设设计错误可能是危险的,并且跳过基类期望被调用的方法是通往灾难的好途径。除非您真的知道该方法没有副作用,否则您无法以完全相同的方式重现您可能会搞砸类的不变量。
【解决方案2】:

您不能从继承的类访问private 方法。 (但你知道的。) 但是您的问题没有说明为什么您的方法不应该是protected,这会将其暴露给继承的类。

您所描述的正是protected 存在的原因。

嵌套类可以工作,但我不推荐它,除非您希望每个需要private 方法的继承类都嵌套在基类中。如果其中一些继承的类有自己的private 方法,甚至更多的继承类需要访问这些方法怎么办?您必须在嵌套类中嵌套类。

【讨论】:

  • 这里的问题是为什么派生类需要访问父类型的私有成员。它要么是基类的糟糕设计,要么是派生类中的一个坏主意,要么是一种旨在将对私有成员的访问限制为严格控制的派生类型组的机制;嵌套的(继承封闭类型的嵌套类型实际上是一种非常有用和优雅的模式)。假设这些场景中的任何一个都为时过早。
猜你喜欢
  • 1970-01-01
  • 2015-09-13
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多