在覆盖的 public 方法中访问私有方法
Accessing a private method in a overridden public method
我目前在从覆盖的 public 方法访问私有方法时遇到一些问题。
我的情况是这样的:我有一个编译后的 .dll 文件,基本上由这个组成
public class OriginalHandler
{
public virtual void Request()
{
RedirectIfConditionIsFulfilled()
this.PeformRequest()
}
protected virtual bool PeformRequest()
{
}
private static void RedirectIfConditionIsFulfilled()
{
}
}
我需要改变方法 PeformRequest()
,所以我做了一个 public class,它继承了 OriginalHandler
并重写了这样的方法:
public class ModifiedOriginalHandler : OriginalHandler
{
protected override bool PeformRequest()
{
}
}
为确保此方法不违反 "impact" 范围,我必须确保它仅在某些网站上进行评估,
我们使用它来确保 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
,
但可以调用内部调用所需函数的 public 方法 Request
,因此我创建了一个覆盖函数,
确保调用的不是原始版本而是我修改后的版本
public class ModifiedOriginalHandler : OriginalHandler
{
protected override bool PeformRequest()
{
}
public override void Request()
{
RedirectIfConditionIsFulfilled()
this.PeformRequest()
}
}
这是我遇到问题的地方,RedirectIfConditionIsFulfilled
是私有方法,
而且我绝不能这样调用此方法。我可以在我重写的函数中删除这个调用,但那样会
要求删除 RedirectIfConditionIsFulfilled
,这会改变我不想做的原始功能。
那么我该如何克服呢?
如何在覆盖的 public 方法中访问私有方法?
如果您有权访问 OriginalHandler
实现,则将派生 class 设为嵌套:
class A {
private void Foo() { }
protected virtual void Bar() { }
public class B: A {
protected override void Bar() {
Foo(); \ legal } } }
如果不这样做,则除非反射,否则无法从外部类型访问另一种类型的私有成员。
您无法从继承的 class 访问 private
方法。 (但你知道的。)
但是你的问题没有给出为什么你的方法不应该是 protected
的任何理由,这会将它暴露给继承的 classes。
您所描述的正是 protected
存在的原因。
嵌套的 class 可以工作,但我不推荐它,除非您希望每个需要 private
方法的继承 class 都嵌套在基础 class。如果其中一些继承的 classes 有自己的 private
方法,甚至更多继承的 classes 需要访问这些方法怎么办?您必须在嵌套的 classes 中嵌套 classes。
我目前在从覆盖的 public 方法访问私有方法时遇到一些问题。
我的情况是这样的:我有一个编译后的 .dll 文件,基本上由这个组成
public class OriginalHandler
{
public virtual void Request()
{
RedirectIfConditionIsFulfilled()
this.PeformRequest()
}
protected virtual bool PeformRequest()
{
}
private static void RedirectIfConditionIsFulfilled()
{
}
}
我需要改变方法 PeformRequest()
,所以我做了一个 public class,它继承了 OriginalHandler
并重写了这样的方法:
public class ModifiedOriginalHandler : OriginalHandler
{
protected override bool PeformRequest()
{
}
}
为确保此方法不违反 "impact" 范围,我必须确保它仅在某些网站上进行评估, 我们使用它来确保 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
,
但可以调用内部调用所需函数的 public 方法 Request
,因此我创建了一个覆盖函数,
确保调用的不是原始版本而是我修改后的版本
public class ModifiedOriginalHandler : OriginalHandler
{
protected override bool PeformRequest()
{
}
public override void Request()
{
RedirectIfConditionIsFulfilled()
this.PeformRequest()
}
}
这是我遇到问题的地方,RedirectIfConditionIsFulfilled
是私有方法,
而且我绝不能这样调用此方法。我可以在我重写的函数中删除这个调用,但那样会
要求删除 RedirectIfConditionIsFulfilled
,这会改变我不想做的原始功能。
那么我该如何克服呢?
如何在覆盖的 public 方法中访问私有方法?
如果您有权访问 OriginalHandler
实现,则将派生 class 设为嵌套:
class A {
private void Foo() { }
protected virtual void Bar() { }
public class B: A {
protected override void Bar() {
Foo(); \ legal } } }
如果不这样做,则除非反射,否则无法从外部类型访问另一种类型的私有成员。
您无法从继承的 class 访问 private
方法。 (但你知道的。)
但是你的问题没有给出为什么你的方法不应该是 protected
的任何理由,这会将它暴露给继承的 classes。
您所描述的正是 protected
存在的原因。
嵌套的 class 可以工作,但我不推荐它,除非您希望每个需要 private
方法的继承 class 都嵌套在基础 class。如果其中一些继承的 classes 有自己的 private
方法,甚至更多继承的 classes 需要访问这些方法怎么办?您必须在嵌套的 classes 中嵌套 classes。