对c#中的继承感到困惑

时间:2011-11-25 02:10:40

标签: c# inheritance base-class

我的基类看起来像这样:

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中执行此操作,那么元字段是否可以在从BaseController继承的类中使用?

2 个答案:

答案 0 :(得分:5)

我可能会像下面这样做。是的,如果您将meta定义为受保护的(或者当然是公共的),则可以访问meta。

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();
   } 
} 

答案 1 :(得分: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();
   }
}

如果您只想从基类访问Meta,请创建meta private。如果您只想从继承自基类的内容访问Meta,那么您可以使用protected。如果您想要创建ABC或DEF实例的任何内容也可以访问Meta,那么请将其设为public