общая функциональность между консольными приложениями C # - PullRequest
3 голосов
/ 21 октября 2009

У меня есть два консольных приложения, Query и Update, которые совместно используют некоторые функции. Я хотел, чтобы два класса наследовали от общего базового класса, но проблема в том, что для консольного приложения у меня должна быть функция static Main. В настоящее время у меня есть следующее:

namespace Utils
{
    public class ConsoleBase
    {
        protected const int ERROR_EXIT_CODE = 1;
        protected static void printWarning(string msg) {...}
        public ConsoleBase(IEnumerable<string> args) { ... }
...

namespace Update
{
    class Update : ConsoleBase
    {
        private static ConsoleBase _consoleBase;
        public static void Main(string[] args) { ... }
...

namespace Query
{
    class Query : ConsoleBase
    {
        private static ConsoleBase _consoleBase;
        public static void Main(string[] args) { ... }
...

Мне кажется, что проблема проектирования заключается в том, чтобы как наследовать от ConsoleBase, так и иметь его экземпляр как переменную static в каждом производном классе. Я делаю это потому, что:

  1. У меня могут быть protected static методы, определенные в ConsoleBase, которые доступны для других static методов в производных классах.
  2. Я могу передать аргументы командной строки в конструктор для ConsoleBase, выполнить обычную работу, а затем снова получить доступ к аргументам в производных классах через public свойства и методы в экземпляре ConsoleBase.

Итак, в производных классах у меня есть смесь вызовов методов / свойств в экземпляре ConsoleBase, например,

_consoleBase.UseDebugMode()

Помимо вызова унаследованных статических методов и доступа к унаследованным константам, которые определены в ConsoleBase, например,

printWarning(CONST_MSG_IN_BASE_CLASS);

Можно как-нибудь это почистить? Разве плохо и наследовать от класса, и хранить экземпляр этого базового класса для работы с

Ответы [ 3 ]

1 голос
/ 21 октября 2009

Не смешивайте статические методы и методы экземпляров, как это.

Рассмотрим разделение ответственности, которую статические методы предоставляют, на другой класс, от которого вы можете наследовать. Сделайте нестатическую функциональность отдельным классом, который вы собираете и создаете в экземплярах Update и Query.

Кроме того, если Update и Query являются производными от ConsoleBase - зачем вам агрегатные экземпляры?

1 голос
/ 21 октября 2009

Да, вы можете определить базовый класс с защищенной статической главной, а затем вызвать BaseClass.Main (args) из метода Main в наследующих классах.

Этот синтаксис более правильный:

public class BaseApp
{
    public static Main(String[] args)
    {
        // TODO: ...
    }
}

public class App1 : BaseApp // Same for App2
{
    // There is no need to keep a reference of the base class
    // if you are accessing static methods only

    public static Main(String[] args)
    {
        BaseApp.Main(args); // Access via class, not via instance
    }
}
0 голосов
/ 22 октября 2009

Не думаю, что вам нужно это делать. Почему бы вам просто не вызвать функцию ConsoleBase.Main () с аргументами командной строки?

Наличие экземпляра базового класса - проблема проектирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...