2011-11-25 101 views
1

我有一個基類看起來像這樣:困惑在C#中繼承

public class BaseController : Controller { 
} 

類繼承這樣的:

public class ABC : BaseController { 
    public void Create(string a, string b) { 
     var Meta = new Meta(); 
     Meta.Title = "test"; 
    } 
} 

public class DEF : BaseController { 
    public void Create(string a, string b, string c) { 
     var Meta = new Meta(); 
     Meta.Title = "job"; 
    } 
} 

每次,繼承BaseController需要創建一個實例的類之一Meta();

是否有某種方法可以將此創建從類ABC & DEF移動到基本控制器中?請注意,類ABC,DEF等中的一些方法具有不同數量的參數。

我有一個想法了,這是做在BaseController如下:

public Meta Meta { get; set; } 
    protected override void Initialize(RequestContext requestContext) 
    { 
     if (Meta == null) { Meta = new Meta(); } 
    } 

這是做有效的事。另外,如果我在BaseController中執行此操作,那麼字段Meta是否可用於從BaseController繼承的類中?

回答

5

我可能會像下面這樣做。是的,你可以訪問元,如果你定義它受保護(或當然公開)。

public class BaseController : Controller { 
    protected Meta meta; 

    public void Create() { 
     meta = new Meta(); 
    } 
} 

public class ABC : BaseController { 
    public void Create(string a, string b) { 
     base.Create(); 
    } 
} 

public class DEF : BaseController { 
    public void Create(string a, string b, string c) { 
     base.Create(); 
    } 
} 
+2

這是一個很好的答案,但var a會與BaseController的Create方法中的參數發生衝突。 –

+0

我沒有修改那裏的代碼,只是合併了這個代碼行,就像它存在的地方。這就是爲什麼我沒有添加受保護的變量等。 –

+0

我剛更改了原文,將其重命名爲其他內容並添加了標題的設置。你能看看嗎?添加保護措施是否明智以及如何提供幫助? –

3

我會做這樣的事情:

public class BaseController : Controller { 
    protected Meta Meta { get; set; } 
    protected void Create() 
    { 
     if (Meta == null) { Meta = new Meta(); } 
    } 
} 

public class ABC : BaseController { 
    public void Create(string a, string b) { 
     base.Create(); 
    } 
} 

public class DEF : BaseController { 
    public void Create(string a, string b, string c) { 
     base.Create(); 
    } 
} 

如果只想從基類訪問元,然後讓元private。如果你只想從繼承基類的東西中獲得Meta,那麼你可以使它成爲protected。如果您想要創建ABC或DEF實例的任何內容都可以訪問Meta,請將其設爲public