2012-04-19 36 views
3

我一直拉我的頭髮一段時間C#在表單中繼承一個類

我創建了一個充滿圖畫框的表單。每個圖片框將包含_click,_mousedown和_mouseup事件。我希望將爲表單創建的這些事件移動到class1.cs中,然後讓form1.cs繼承這些事件。

我不想讓picturebox1公開。 等東西如 Class1 classOne = new Class1(); pictureBox1.Click + = new EventHandler(cs.pictureBox1_Click);不管用。我不確定如何讓form1.cs繼承class1.cs。只是在心理空白

的聲音在我的頭上,但我太容易我已經厭倦了Form1類:表格,Class1的

在Form1.Designer.cs this.pictureBox1.Click + =新System.EventHandler(這一點。 pictureBox1_Click); this.pictureBox1_Click無法訪問

如果你能指出我在正確的直接,這將是一個很大的幫助!乾杯

Form1.cs 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
} 

Class1.cs 
class Class1 
{ 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pb1 click"); 
    } 
} 
+1

C#不支持多類繼承,所以Form1可以繼承Form或Class1,但不能同時繼承。您可以使Class1繼承Form,然後Form1繼承Class1。 – ulty4life 2012-04-19 01:21:52

回答

0

你不需要讓圖片框本身的公衆,但你需要做的事件處理程序到Class公衆,使他們能夠在其他地方訪問。

我真的不明白你應該特別要求繼承的原因。看看here瞭解更多信息。

2

Class1應該Form繼承,然後Form1將從Class1繼承:

class Class1 : Form 
{ 
    //... 
} 

public partial class Form1 : Class1 
{ 
    //... 
} 

確保所有partial聲明從Class1繼承,而不是從Form。 (這可能會爲任何自動生成的代碼添加額外的步驟,這是partial類的經典原因。您可能需要爲此編寫自己的自動化)。試圖通過具有FormForm1之間的中間類型來實現。 Class1應該是一個通用的「基本形式」,多種形式將繼承?還是你想要做別的事情?但是,如果您希望Form1能夠訪問Class1的成員而不將它們暴露爲public成員,則可以改爲protected

+0

我認爲它解決了眼前的問題,但使長期問題變得更糟。 – 2012-04-19 01:30:28

+0

@KendallFrey:很可能,是的。我認爲OP需要退後一步,更清楚地確定在這種情況下繼承的必要性。就我個人而言,我發現缺乏經驗的開發人員嚴重過度使用繼承作爲一種工具,最終導致矛盾的是,非面​​向對象的設計。 – David 2012-04-19 01:32:28

0

是否想訂閱Form1事件Class1?嘗試是這樣的:

//Form1.cs 
public partial class Form1 : Form 
{ 
    Class1 class1; 

    public Form1() 
    { 
     InitializeComponent(); 
     class1 = new Class1(); 
     this.pictureBox1.Click += new EventHandler(class1.pictureBox1_Click); 
    } 
} 

//Class1.cs 
class Class1 
{ 

    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pb1 click"); 
    } 
} 

它看起來像你正在嘗試做的是不是繼承,而只是通知GUI事件的外部對象。你應該重新評估你的代碼想想究竟是你試圖做什麼。

3

繼承定義了一個'是'的關係,所以除非Form1 是-al Class1,那麼你沒有以正確的方式接近它。你真的取決於你想要什麼樣的設計幾個選項:

  1. 通過公開方法傳遞形式的類的實例,讓類附加的事件處理程序(這似乎更有意義在這些情況下,如果有多個表單共享行爲)。

  2. 在窗體本身中存儲常見行爲(作爲特殊類型的窗體,PictureClickingForm),然後讓其他窗體繼承該窗體。現在可以保護方法。

這是一個繼承vs遏制的問題。有關這方面的更多信息,以這種方式說出問題。

1

只有這樣,你可以通過改變將Class1.cs如下

public partial class Form1 
{ 
    private void pictureBox1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("pb1 click"); 
    } 
} 
0

你Form1上是一個類實現它,所以只是從Form1中繼承窗體2。 (而不是試圖將部分複製回一些新的Class1.cs文件)Form1.designer.cs仍然是Form1定義的一部分,只是爲了圖形表單設計者的目的而放在一邊。但請注意,定義中沒有其他部分(甚至沒有設計師!Iy都在那裏!)。

此外,您不必將這些類設置爲公開的,以使pictureboxes在內部可以訪問相同的程序集。

選項:您可以在Form1中創建自己的事件,也可以創建abstractvirtual方法來處理Form1的事件發生與像Form2這樣的子類。

這有幫助嗎?

0

您可以始終使用一個接口。關鍵是你只能從一個類繼承,但是有很多接口......所以我假設你需要這樣一個接口 - 將方法傳遞給其他任何接口。遠離界面,你總是可以把你的類作爲參數傳遞給第二類Form的構造函數(使用'this'關鍵字),這樣你就可以很容易地傳遞值,從以前的表單的方法讓我們說到另一個(例如事件)。