2009-10-21 146 views
3

我有兩個控制檯應用程序,查詢和更新,共享一些功能。我想讓這兩個類繼承自一個公共基類,但問題是,對於控制檯應用程序,我必須具有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); 

我能以某種方式清理它嗎?從一個類繼承並保持該基類的一個實例來處理它是不是很糟糕?

回答

1

請勿混用靜態和實例方法是這樣的。

考慮一下,將靜態方法提供的責任分離到可以繼承的不同類中。使非靜態功能成爲您在「更新」和「查詢」中聚合並實例化的單獨類。

另外,如果Update和Query是ConsoleBase的衍生物 - 爲什麼你需要聚集實例?

+0

我喜歡將'ConsoleBase'中的靜態方法與實例方法分開的想法。現在,如果我能想到這兩個類的好名字...... – 2009-10-21 20:01:41

1

是的,你可以定義一個帶有受保護的靜態主類的基類,然後在繼承類的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 
    } 
} 
0

我不認爲你需要這樣做。你爲什麼不簡單地用命令行參數調用ConsoleBase.Main()函數?

有一個基類的實例是一個設計問題。

+0

我希望命令行參數作爲實例變量存儲,因爲它們直到運行時纔會被知道。如果我在'ConsoleBase'中有一個'static'主函數,那麼我將無法在'static'函數中訪問這些實例變量。 – 2009-10-21 20:05:07

相關問題