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

时间:2009-10-21 19:51:02

标签: 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) {...}
        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. 我可以将命令行参数传递给ConsoleBase的构造函数,执行常见的操作,然后通过public实例ConsoleBase的属性和方法在派生类中再次访问参数1}}。
  3. 因此,在派生类中,我在ConsoleBase的实例上混合了对方法/属性的调用,例如

    _consoleBase.UseDebugMode()
    

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

    printWarning(CONST_MSG_IN_BASE_CLASS);
    

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

3 个答案:

答案 0 :(得分:1)

是的,您可以使用受保护的静态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
    }
}

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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