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

问题描述:

我有两个控制台应用程序,查询和更新,共享一些功能。我想让这两个类继承自一个公共基类,但问题是,对于控制台应用程序,我必须具有static Main函数。我目前有如下:C#控制台应用程序之间的共享功能

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. 我可以在ConsoleBase定义protected static方法,这些方法在派生类其他static方法访问。
  2. 我可以沿着命令行参数传递给构造函数为ConsoleBase,做普通的东西,然后通过public属性和方法在派生类再次访问的ConsoleBase实例的参数。

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

_consoleBase.UseDebugMode() 

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

printWarning(CONST_MSG_IN_BASE_CLASS); 

我能以某种方式清理它吗?从一个类继承并保持该基类的一个实例来处理它是不是很糟糕?

请勿混用静态和实例方法是这样的。

考虑一下,将静态方法提供的责任分离到可以继承的不同类中。使非静态功能成为您在“更新”和“查询”中聚合并实例化的单独类。

另外,如果Update和Query是ConsoleBase的衍生物 - 为什么你需要聚集实例?

+0

我喜欢将'ConsoleBase'中的静态方法与实例方法分开的想法。现在,如果我能想到这两个类的好名字...... – 2009-10-21 20:01:41

是的,你可以定义一个带有受保护的静态主类的基类,然后在继承类的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.Main()函数?

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

+0

我希望命令行参数作为实例变量存储,因为它们直到运行时才会被知道。如果我在'ConsoleBase'中有一个'static'主函数,那么我将无法在'static'函数中访问这些实例变量。 – 2009-10-21 20:05:07