继承基类时如何避免错误“找不到类型'MyType'的构造函数”

Posted

技术标签:

【中文标题】继承基类时如何避免错误“找不到类型\'MyType\'的构造函数”【英文标题】:How to avoid error "Constructor on type 'MyType' not found" when inheriting a base class继承基类时如何避免错误“找不到类型'MyType'的构造函数” 【发布时间】:2013-04-25 21:56:07 【问题描述】:

我有一个 Visual Studio 2010 Windows Forms 应用程序,其中包含一个其他类将继承的 Form 基类。基类的构造函数接受子类将传递给基类的参数。

例子:

public partial class BaseForm : Form

    public BaseForm(int number)
    
        InitializeComponent();
    


public partial class ChildForm : BaseForm

    public ChildForm(int number)
        : base(number)
    
        InitializeComponent();
    

我遇到的问题是,当我尝试在 VisualStudio 的设计视图模式下打开 ChildForm 时,我收到以下错误:

找不到类型“MyProject.BaseForm”的构造函数。

注意:不管报错,项目编译运行正常。

如果我用不包含任何参数的构造函数重载构造函数,我可以避免错误。

示例:(这消除了错误)

public partial class BaseForm : Form

    public BaseForm(int number)
    
        InitializeComponent();
    

    public BaseForm()
    
        InitializeComponent();
    


public partial class ChildForm : BaseForm

    public ChildForm(int number)
        : base(number)
    
        InitializeComponent();
    

我的问题是,如何创建不包含无参数构造函数的基类并避免设计视图错误?

【问题讨论】:

【参考方案1】:

那是完全不可能的。

您在设计视图中看到的表单是您的基类的实际实例。 如果没有默认构造函数,则设计者无法创建该实例。

您可以将构造函数标记为[Obsolete("Designer only", true)],并使其在不在设计器中调用时抛出异常,以防止其他人调用它。

【讨论】:

需要的无参实例构造函数可以是private吗? @JeppeStigNielsen - 是的。这就是我最终做的事情,一切都很好。 如果与继承的类不同,请确保编译基类所在的项目。【参考方案2】:

您需要调整 BaseForm 输出类型,在项目的属性中,将输出类型从 Windows 应用程序更改为类库。

参考: https://docs.microsoft.com/en-us/dotnet/framework/winforms/advanced/walkthrough-demonstrating-visual-inheritance

【讨论】:

以上是关于继承基类时如何避免错误“找不到类型'MyType'的构造函数”的主要内容,如果未能解决你的问题,请参考以下文章

向上转换到基类时如何使用继承的类成员的值

如何在基类的函数上使用装饰器并在继承基类时让装饰器在该函数上工作

C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)

C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)

C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)

在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数