2013-03-14 34 views
1

我有一個使用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 } 

主叫GetType()_workcontext上會輸出

{Name = "AbcWebWorkContext" FullName = "Nop.Web.Framework.AbcWebWorkContext"}

的類型層次是IWorkContext(接口)« WebWorkContext « AbcWebWorkContext

_workContext被聲明爲IWorkContext和Autofac生成實例作爲AbcWebWorkContext(如上圖所示)

+0

這個方法在基類中是如何聲明的? – pickypg 2013-03-14 02:32:23

+0

@pickypg將其添加到問題 – JSBach 2013-03-14 02:38:32

+0

http://stackoverflow.com/questions/1853896/is-it-possible-to-override-a-non-virtual-method – pickypg 2013-03-14 02:48:11

回答

3

new關鍵字意味着該子類的方法獸皮所述基類的CurrentCustomer代替重寫,所以WebWorkContext.CurrentCustomer是一個完全不同的方法比AbcWebWorkContext.CurrentCustomer

您必須聲明基類的方法,

virtual Customer CurrentCustomer { ... } 

類和子類的方法

override Customer CurrentCustomer { ... } 

我建議你閱讀更多關於polymorphism in c#

如果你使用的方法是在界面,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]); 
+0

我不能,因爲我無法更改核心源代碼。在_workcontext中調用gettype()將會輸出 {Name =「AbcWebWorkContext」FullName =「Nop.Web.Framework.AbcWebWorkContext」}。所以應該調用AbcWebWorkContext版本的方法。對? – JSBach 2013-03-14 02:42:00

+0

對不起,我既沒有自己的主叫代碼,也沒有被叫代碼。我試圖攔截這個調用來改變它的行爲而不改變核心的代碼。 – JSBach 2013-03-14 03:11:04

+0

@Oscar然後恐怕重新實現界面可能是你唯一的選擇。 – 2013-03-14 03:13:23

2

我不知道如果我得到你的問題的權利,但我認爲你需要一個virtual改性劑添加到方法,並在子類中爲方法添加override修飾符。

瞭解更多關於MSDN

+0

是的,這將覆蓋該方法,但我無法添加「虛擬」,因爲我不能更改源代碼 – JSBach 2013-03-14 02:39:05

+0

@Oscar,C#不像Java,方法默認情況下不是虛擬的。如果無法修改基類以使該方法爲虛擬,則無法在子類中重寫該方法。你可以選擇隱藏它,但正如你所發現的那樣,除了通過派生類的自己的引用,它沒有用。 – 2013-03-14 02:42:01

+0

是的,我的壞。我在這個問題的標題中寫了「覆蓋」。我的意思是隱藏。我會編輯它。在_workcontext中調用gettype()將輸出{Name =「AbcWebWorkContext」FullName =「Nop.Web.Framework.AbcWebWorkContext」}。所以應該調用AbcWebWorkContext版本的方法。對? – JSBach 2013-03-14 02:45:50

相關問題