C# 在C中继承Windows窗体控件#

C# 在C中继承Windows窗体控件#,c#,winforms,inheritance,C#,Winforms,Inheritance,我有一个用于LayoutPanel的自定义控件,其中包含子控件。我希望确保所有子控件都包含布局面板父容器中的某个属性。我尝试使用以下代码创建各种子控件,这些子控件将确保属性ChartPropertyOwner的存储,并依赖继承来假定类型(标签、按钮、标准表单控件) 我使用以下语句初始化: Button btnManipDel= new ManipControl(_cps); 我收到错误消息: 无法将类型“ManipControl”隐式转换为“System.Windows.Forms.Butto

我有一个用于LayoutPanel的自定义控件,其中包含子控件。我希望确保所有子控件都包含布局面板父容器中的某个属性。我尝试使用以下代码创建各种子控件,这些子控件将确保属性ChartPropertyOwner的存储,并依赖继承来假定类型(标签、按钮、标准表单控件)

我使用以下语句初始化:

Button btnManipDel= new ManipControl(_cps);
我收到错误消息:

无法将类型“ManipControl”隐式转换为“System.Windows.Forms.Button”


为什么隐式转换失败?我如何解决这个问题

ManipControl->System.Windows.Forms.Control

按钮->System.Windows.Forms.Control

按钮不保证为手动控制

要解决这个问题,您可以显式地强制转换到按钮

Button btnManipDel= (Button)new ManipControl(_cps);
我不知道这是作为一个按钮做的最好的事情!=操纵控制。唯一保证的函数将来自其基类System.Windows.Forms.Control。这是一个更好的类,我相信会隐式地进行转换(但不是正面的):


您可能需要读取变量、方差和协方差。

转换失败,因为虽然ManipControl是控件,Button是控件,但ManipControl不是按钮

Button btnManipDel= (Button)new ManipControl(_cps);
您可以将类更改为接口并创建新的ManipButton:

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

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

按钮是一个按钮,与ManipControl没有关系。如果您想让Button控件公开您的属性,请实现接口IMyInterface并从Button继承。公共类MyButton:Button,IMyInterface{//Do the business}我认为创建一个没有公共无参数构造函数的控件不是一个好主意。你能详细说明一下@ja72吗?创建没有无参数构造函数的控件会在Windows窗体设计器中使用时产生问题。设计师将不知道如何满足构造函数的参数。
public interface IManipControl
{
    int ChartPropertyOwner { get; set; }
}

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