общая функциональность между консольными приложениями C #

StackOverflow https://stackoverflow.com/questions/1603183

Вопрос

У меня есть два консольных приложения, 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 в каждом производном классе. Я делаю это потому, что:

<Ол>
  • У меня могут быть защищенные статические методы , определенные в ConsoleBase , которые доступны для других методов static в производных классах.
  • Я могу передать аргументы командной строки в конструктор для ConsoleBase , выполнить обычные операции, а затем снова получить доступ к аргументам в производных классах через свойства и методы public в экземпляре ConsoleBase .
  • Итак, в производных классах у меня есть смесь вызовов методов / свойств в экземпляре ConsoleBase , например

    .
    _consoleBase.UseDebugMode()
    

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

    .
    printWarning(CONST_MSG_IN_BASE_CLASS);
    

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

    Это было полезно?

    Решение

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

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

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

    Другие советы

    Да, вы можете определить базовый класс с помощью защищенного статического main, а затем вызвать 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
        }
    }
    

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top