继承C#中的Windows窗体控件

问题描述:

我有一个用于保存子控件的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

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和逆变和协方差阅读起来。

转换失败,因为虽然ManipControl是一个控件,而Button是一个控件,ManipControl不是一个按钮。

你可以你的类更改为一个接口,并创建一个新的ManipButton:

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

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