2012-10-05 84 views
2

我有以下繼承層次:在窗體構造函數傳遞參數,的WinForms C#

A類:表
B類:A類

A類需要能夠接受一個參數,從而我可以創建B類的這樣的實例:

ClassB mynewFrm = new ClassB(param); 

如何定義A級這樣的構造?

謝謝!

我使用的Winforms在.NET 3.5,C#

EDITED: A類和B類被定義爲的形式,使用部分類。 所以我想這是一個關於部分類和自定義(overriden)構造函數的問題。

回答

0

類的構造函數看起來像這樣。

private Object _object1; 

public ClassA(object object1) 
{ 
    _object1 = object1; 
} 
0

對於ClassA你的構造看起來像

public ClassA(Object param) 
{ 
    //... 
} 

ClassB它看起來像

public ClassB(Object param) : base(param) 
{ 
    //... 
} 

其中base(param)實際上將調用ClassA構造函數接受參數。

6

這裏是一個完整的演示樣本,展示了所需的行爲。

爲了方便您的學習,我選擇了一個字符串類型參數,以適應您的情況。

爲了測試它,創建一個新的的Visual Studio * C# *項目,並填寫的Program.cs用下面的代碼

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace Stackoverflow 
{ 

    public class ClassA : Form 
    { 
     public ClassA() 
     { 
      InitializeComponent(); 
     } 

     public ClassA(string WindowTitleParameter) 
     { 
      InitializeComponent(); 
      this.Text = WindowTitleParameter; 
      MessageBox.Show("Hi! I am ClassB constructor and I have 1 argument. Clic OK and look at next windows title"); 
     } 

     private void InitializeComponent() // Usually, this method is located on ClassA.Designer.cs partial class definition 
     { 
      // ClassA initialization code goes here 
     } 

    } 

    public class ClassB : ClassA 
    { 
     // The following defition will prevent ClassA's construtor with no arguments from being runned 
     public ClassB(string WindowTitleParameter) : base(WindowTitleParameter) 
     { 
      InitializeComponent(); 
      //this.Text = WindowTitleParameter; 
      //MessageBox.Show("Hi! I am ClassB constructor and I have 1 argument. Clic OK and look at next windows title"); 
     } 

     private void InitializeComponent() // Usually, this method is located on ClassA.Designer.cs partial class definition 
     { 
      // ClassB initialization code goes here 
     } 

    } 

    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      // If you debug this code using StepInto, you will notice that contructor of ClassA (argumentless) 
      // will run prior to contructor of classB (1 argument) 

      Application.Run(new ClassB("Look at me!")); 
     } 
    } 
} 
+0

A類需要能夠接受的參數,而不是類B.不需要在構造函數中的某個時刻調用InitializeComponent()例程? – sarsnake

+0

當我實現上面的構造函數,它抱怨說''ClassA'不包含一個構造函數,它採用'0'參數' – sarsnake

+0

嗨sarname。我剛剛完成了一個代碼修訂,它允許您在ClassA或ClassB上使用相同的參數。我建議你使用調試器的STEP-INTO功能來更好地瞭解代碼流。希望能幫助到你 –