3

我有两个控制台应用程序,查询和更新,它们共享一些功能。我想让这两个类继承自一个公共基类,但问题是,对于控制台应用程序,我必须有一个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. 我可以将命令行参数传递给 for 的构造函数,做一些ConsoleBase常见的事情,然后通过.publicConsoleBase

所以在派生类中,我混合了对实例的方法/属性的调用ConsoleBase,例如

_consoleBase.UseDebugMode()

以及调用继承的静态方法和访问定义的继承常量ConsoleBase,例如

printWarning(CONST_MSG_IN_BASE_CLASS);

我可以以某种方式清理它吗?从一个类继承以及保留该基类的一个实例以供使用是不是很糟糕?

4

3 回答 3

1

是的,您可以使用受保护的静态 main 定义基类,然后从继承类中的 Main 方法调用 BaseClass.Main(args)。

这个语法更正确:

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
    }
}
于 2009-10-21T19:58:03.687 回答
1

不要像这样混合使用静态方法和实例方法。

考虑一下,将静态方法提供的职责分离到可以继承的不同类中。使非静态功能成为您在 Update 和 Query 中聚合和实例化的单独类。

此外,如果 Update 和 Query 是 ConsoleBase 的衍生产品 - 为什么需要聚合实例?

于 2009-10-21T19:59:15.400 回答
0

我不认为你需要这样做。为什么不简单地使用命令行参数调用 ConsoleBase.Main() 函数?

拥有基类的实例是一个设计问题。

于 2009-10-21T20:02:38.903 回答