2010-09-30 41 views
0

的plumbings在一個典型的winform Program.cs中包含入口點:如何隱藏在Program.cs

 static void Main(string[] args) { 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     // the code goes on 

我想創建自己的框架,它隱藏所有東西的plumbings那無關與應用領域,所以我希望能夠在創建一個基類,另一個命名空間是這樣的

namespace MyFramework 
{ 
    public partial class Program 
    { 



     [STAThread] 
     static void Main(string[] args) 
     { 

      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 


      // the code goes on 

然後在我的應用程序的命名空間的Program.cs從上繼承上述E,這樣我可以擺脫掉了Application.EnableVisualStyles和只寫這樣的事情

 static void Main(string[] args): base() 
     { 
      //only app domain code 

我可以從基類繼承,如果我從兩個類中刪除靜態ATTRIB,但我無法從主消除靜電進入方法,所以我不能最終確定。

我不想使用後面的代碼來隱藏管道,因爲我需要將此端口移植到其他沒有代碼的語言。

那麼有沒有辦法實現這個簡單和合法的目標與OOP(繼承與否,靜態或不),而不使用一些大的外部框架?

例如有沒有一種方法可以將主入口點委託給框架命名空間中的另一個類?

回答

1

入口點方法需要是靜態的,所以使用繼承(如你所感知的)將不起作用,但可以通過多種方法來執行你想要做的事情。例如,

namespace MyFramework 
{ 
    public static class AppStarter 
    { 

     static EventHandler AppStarting; 

     [STAThread] 
     static void Run(string[] args) 
     { 

      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 


      // the code goes on 

      if (null != AppStarting) 
      { 
       AppStarting(null, EventArgs.Empty); 
      } 

現在,你可以用它

public partial class Program 
{ 
     [STAThread] 
     static void Main(string[] args) 
     { 

      AppStarter.AppStarting += new EventHandler(MyStartupCode); 
      AppStarter.Run(args); 

另一種基於繼承的變化將是

namespace MyFramework 
{ 
    public abstract class Application 
    { 

     protected abstract void OnBeforeInit(); 
     protected abstract void OnAfterInit(); 

     protected void Run(string[] args) 
     { 
      OnBeforeInit(); 

      // Do initialization 

      OnAfterInit(); 

      ... 
     } 

你會按如下方式使用它:

public class MyApplication: MyFramework.Application 
{ 
     [STAThread] 
     static void Main(string[] args) 
     { 

      (new MyApplication()).Run(args); 
+0

非常感謝,似乎我想要研究這一切。 – user310291 2010-09-30 14:43:59

0

您的入口點必須是static

+0

好吧我重寫了我的目標:「如何隱藏水管o f program.cs「而不是如何繼承program.cs。 – user310291 2010-09-30 05:45:50

+0

例如有沒有一種方法可以將主入口點委託給框架命名空間中的另一個類? – user310291 2010-09-30 05:47:16

1

要做到這一點,最好的辦法是讓你的Program類成爲一個非靜態類,它從另一個類(將完成你所需要的所有工作的類)派生。您可以在基類中聲明static方法,並在Application.EnableVisualStyles();之前調用該方法。

爲同一代碼將是這樣的:

public class Program : MyBaseClass 
{ 
    [STAThread] 
    static void Main() 
    { 
     MethodToDoAllTheHardWork(); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

public class MyBaseClass 
{ 
    public static void MethodToDoAllTheHardWork() 
    { 
    } 
} 

原因在MyBaseClass聲明static方法是因爲Main方法必須是一個static方法,你只能調用靜態成員相同或基類。

+0

你能給一個代碼骨架感謝嗎? – user310291 2010-09-30 06:29:46

+0

添加了代碼。 – Yogesh 2010-09-30 06:40:35

+0

感謝您的試用。我在你的實現中看到的問題是,如果我從MyBaseClass繼承,它不再是一個通用的框架,因爲每次我設置新的域應用程序時都必須更改框架代碼。 – user310291 2010-09-30 14:40:06