[英]Why is my inherited class not hiding my base class method?
我有一個使用Autofac實例化對象的項目
builder.RegisterType<AbcWebWorkContext>().As<IWorkContext>().InstancePerHttpRequest();
這AbcWebWorkContext
是的子類WebWorkContext
:
public partial class AbcWebWorkContext : WebWorkContext
在我的AbcWebWorkContext
我想從父類中隱藏方法和屬性
protected new Customer GetCurrentCustomer(){ //do stuff }
new public Customer CurrentCustomer { //do studd }
但是當有人打電話
_workContext.CurrentCustomer
基類屬性被調用。 如果我這樣稱呼它
((AbcWebWorkContext) _workContext).CurrentCustomer
有用。
我想知道為什么我無法隱藏父方法。 我不能更改被調用的類,因為它是NopCommerce
的核心,因此我不想更改。
為什么不隱藏該方法?
方法的基類聲明:
protected Customer GetCurrentCustomer() { // do stuff }
public Customer CurrentCustomer{ // do stuff }
在_workcontext
上調用GetType()
將輸出
{Name = "AbcWebWorkContext" FullName = "Nop.Web.Framework.AbcWebWorkContext"}
類型層次結構是IWorkContext
(接口)« WebWorkContext
« AbcWebWorkContext
_workContext
聲明為IWorkContext
,Autofac生成一個實例作為AbcWebWorkContext
(如上所示)
new
關鍵字意味着子類的方法將隱藏基類的CurrentCustomer
而不是覆蓋它,因此WebWorkContext.CurrentCustomer
是與AbcWebWorkContext.CurrentCustomer
完全不同的方法。
您必須將基類的方法聲明為
virtual Customer CurrentCustomer { ... }
和子類的方法
override Customer CurrentCustomer { ... }
我建議您閱讀有關c#中多態性的更多信息。
如果您使用的方法實際上是在接口IWebWorkContext
定義的, IWebWorkContext
只需封裝基類,而不是從基類繼承即可,如下所示:
class AbcWebWorkContext : IWebWorkContext
{
private WebWorkerContext _inner = new WebWorkerContext();
public Customer CurrentCustomer { ... }
}
如果不能使基類的方法虛擬化,則必須做一些不太優雅的事情,例如反射:
var prop = _workContext.GetType().GetProperty("CurrentCustomer");
var value = (Customer)prop.GetValue(_workContext, new object[0]);
我不確定我是否正確回答了您的問題,但是我認為您需要向基類中的方法添加一個virtual
修飾符,並向子類中的方法添加一個override
修飾符。
在MSDN上找到更多信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.