簡體   English   中英

為什么繼承的類沒有隱藏我的基類方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM