общая функциональность между консольными приложениями C #
-
05-07-2019 - |
Вопрос
У меня есть два консольных приложения, 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 () с аргументами командной строки?
Наличие экземпляра базового класса - проблема проектирования.