2012-02-24 163 views
0

我有一個用於保存子控件的LayoutPanel的自定義控件。我希望確保所有子控件都包含佈局面板的父容器中的某個屬性。我嘗試使用下面的代碼來創建不同的子控件,這將確保該物業ChartPropertyOwner的存儲,依靠繼承承擔的類型(標籤,按鈕,標準表格控件)繼承C#中的Windows窗體控件

public partial class ManipControl : System.Windows.Forms.Control { 

     public ChartPropertySet ChartPropertyOwner { get; set; } 

     public ManipControl(ChartPropertySet _cps) { 
      ChartPropertyOwner = _cps; 
      InitializeComponent(); 
     } 
} 

我與初始化聲明如下:

Button btnManipDel= new ManipControl(_cps); 

我收到的錯誤:

無法隱式轉換類型 'ManipControl' 到「System.Windows.Forms.Button '

爲什麼隱式轉換失敗,我該如何解決?

+0

一個按鈕一個按鈕,有一個ManipControl沒有關係。如果你想有一個Button控件,你的屬性可以暴露一個Interface IMyInterface並且繼承自Button。公共類MyButton:Button,IMyInterface {//做生意} – Lloyd 2012-02-24 17:18:43

+0

我不認爲創建一個沒有公共無參數構造函數的控件是個好主意。 – ja72 2012-02-24 18:31:21

+0

你可以詳細說明@ ja72嗎? – sammarcow 2012-02-27 14:58:59

回答

2

ManipControl-> System.Windows.Forms.Control的

按鈕 - > System.Windows.Forms.Control的

鈕是不能保證是一個ManipControl

要解決這種情況,可以只是明確地轉換爲Button。

Button btnManipDel= (Button)new ManipControl(_cps); 

我不知道這是做Button的最好的東西!= ManipControl。唯一保證的函數將來自它們的System.Windows.Forms.Control的基類。這是較好的一類投了,我相信這將隱式轉換(但我沒有正面):

System.Windows.Forms.Control btnManipDel= new ManipControl(_cps); 

你可能想在Liskov's Substition Principle和逆變和協方差閱讀起來。

0

轉換失敗,因爲雖然ManipControl是一個控件,而Button是一個控件,ManipControl不是一個按鈕。

你可以你的類更改爲一個接口,並創建一個新的ManipButton:

public interface IManipControl 
{ 
    int ChartPropertyOwner { get; set; } 
} 

public class ManipButton : Button, IManipControl 
{ 
    public int ChartPropertyOwner{get;set;} 
}