继承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 '
为什么隐式转换失败,我该如何解决?
答
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;}
}
一个按钮一个按钮,有一个ManipControl没有关系。如果你想有一个Button控件,你的属性可以暴露一个Interface IMyInterface并且继承自Button。公共类MyButton:Button,IMyInterface {//做生意} – Lloyd 2012-02-24 17:18:43
我不认为创建一个没有公共无参数构造函数的控件是个好主意。 – ja72 2012-02-24 18:31:21
你可以详细说明@ ja72吗? – sammarcow 2012-02-27 14:58:59