C#控制台应用程序之间的共享功能

C#控制台应用程序之间的共享功能,c#,inheritance,console-application,abstraction,C#,Inheritance,Console Application,Abstraction,我有两个控制台应用程序,查询和更新,它们共享一些功能。我想让这两个类从一个公共基类继承,但问题是,对于控制台应用程序,我必须有一个static Main函数。我目前的情况如下: namespace Utils { public class ConsoleBase { protected const int ERROR_EXIT_CODE = 1; protected static void printWarning(string msg) {...

我有两个控制台应用程序,查询和更新,它们共享一些功能。我想让这两个类从一个公共基类继承,但问题是,对于控制台应用程序,我必须有一个
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
中定义的继承常量,例如

_consoleBase.UseDebugMode()
printWarning(CONST_MSG_IN_BASE_CLASS);

我能清理一下吗?既从类继承,又保留该基类的实例以供使用是否不好?

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

此syntex更为正确:

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的衍生产品,那么为什么需要聚合实例呢?

我认为您不需要这样做。为什么不直接用命令行参数调用ConsoleBase.Main()函数呢


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

我喜欢将
ConsoleBase
中的
static
方法与实例方法分离的想法。现在,如果我能想出这两个类的好名字……我希望命令行参数存储为实例变量,因为它们在运行时之前是未知的。如果我在
ConsoleBase
中有一个
static
主函数,我将无法访问该
static
函数中的那些实例变量。