Запутался насчет наследования в c # - PullRequest
1 голос
/ 25 ноября 2011

У меня есть базовый класс, который выглядит следующим образом:

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?

Ответы [ 2 ]

5 голосов
/ 25 ноября 2011

Я бы, наверное, сделал это, как показано ниже.И да, вы можете получить доступ к мета-методу, если определите его защищенным (или общедоступным, конечно).

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();
   } 
} 
3 голосов
/ 25 ноября 2011

Я бы сделал что-то вроде этого:

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 только из базового класса, сделайте мета private. Если вы хотите получить доступ к Meta только из вещей, которые наследуются от базового класса, тогда вы делаете его protected. Если вы хотите, чтобы все, что создает экземпляр ABC или DEF, также имело доступ к Meta, сделайте его public.

...