我有两个控制台应用程序,即“查询”和“更新”,它们共享一些功能。我想让这两个类从一个通用基类继承,但是问题是,对于控制台应用程序,我必须具有一个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变量,这是一个设计问题。我这样做的原因是:


我可以在protected static中定义ConsoleBase方法,派生类中的其他static方法可以访问这些方法。
我可以将命令行参数传递给ConsoleBase的构造函数,进行常见的操作,然后通过public实例上的ConsoleBase属性和方法在派生类中再次访问这些参数。


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

_consoleBase.UseDebugMode()


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

printWarning(CONST_MSG_IN_BASE_CLASS);


我可以以某种方式清理吗?既继承自一个类又保留该基类的实例以进行工作是否不好?

最佳答案

不要将静态方法和实例方法混合在一起。

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

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

10-06 06:11