2011-11-25 80 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