如何在 C# 中扩展表单类? [复制]
Posted
技术标签:
【中文标题】如何在 C# 中扩展表单类? [复制]【英文标题】:How to Extend form class in C#? [duplicate] 【发布时间】:2015-01-30 11:20:35 【问题描述】:我用 c# 设计了 3 种不同的获胜形式。
public partial class SLOSPR : form
public bool IsCallable;
public void PopulateData();
public partial class SLOFIX : form
public bool IsCallable;
public void PopulateData();
public partial class SPDBID : form
public bool IsCallable;
public void PopulateData();
我在每个表单的类中声明了一个成员变量IsCallable,在每个表单的类中声明了一个成员函数PopulateData()。之所以如此,是因为,在代码段中,我想声明一个表单类型的变量,并希望分配上述 3 个类中的任何一个的对象,并使用该 IsCallable 变量并调用 填充数据()。
像这样:
public form RetForm()
form frm=new /* constructor of any 3 forms mentioned above*/
//this function can return any of the three types which will be decided at run time.
return frm;
form frm=RetForm();
这里我想使用 IsCallable 并调用 PopulateData()。
像这样:
if(frm.Iscallable)
frm.PopulateData();
这在语法上是不可能的,因为 Iscallable 和 PopulateData 不是表单类的成员
为了解决这个问题,我将表单类扩展为一个抽象类,并从扩展类中声明了这 3 个表单。
public abstract class EXTENDED_FORM : form
public bool IsCallable;
public abstract void PopulateData();
并像这样更改了这三种形式的定义。
public partial class SLOSPR : EXTENDED_FORM
public override void PopulateData()
/*body for SLOSPR */
public partial class SLOFIX : EXTENDED_FORM
public override void PopulateData()
/*body for SLOFIX */
public partial class SPDBID : EXTENDED_FORM
public override void PopulateData()
/*body for SPDBID*/
现在我这样做了:
public EXTENDED_FORM RetForm()
EXTENDED_FORM frm=new /* constructor of any 3 forms mentioned above*/
//this function can return any of the three types which will be decided at run time.
return frm;
EXTENDED_FORM frm=RetForm();
现在我可以这样调用了:
if(frm.Iscallable)
frm.PopulateData();
将调用自动覆盖的 PopulateData。
我终于确定了自己的目标。但随着我的改变
public partial class SLOSPR : form /*[Designer generated code]*/
到
public partial class SLOSPR : EXTENDED_FORM
Visual Studio 中的 GUI 设计器搞砸了,显示以下页面。
如何摆脱这个,在不妨碍设计师的情况下实现我的目的???
【问题讨论】:
您需要找出它崩溃的原因。为此,请打开两个 Visual Studio 实例。将第一个实例的调试器附加到第二个实例(通过 Debug | Attach to process)。在第二种情况下,在设计器中打开表单,以便发生错误。现在第一个实例应该进入调试器,向您显示导致问题的代码。 如果您开始输入“设计者无法创建实例摘要”,请查看关于第一个 Google 结果的副本。如果抽象类不包含实现,您也可以只在表单上使用接口。 你也可以通过接口来实现...i.imgur.com/Ephj3H3.png 【参考方案1】:不要将 EXTENDED_FORM 抽象化;从其声明中删除抽象并添加不带参数的受保护构造函数
【讨论】:
这很不幸;在我以前的公司(遗留代码)中,我们不得不处理抽象的基本形式。这些问题有点不确定,有时一个干净的解决方案,关闭 VS 并重建会解决这个问题,有时你需要做两次/三次。我不确定是否存在任何有效的解决方法 - 所以我会选择这个答案。以上是关于如何在 C# 中扩展表单类? [复制]的主要内容,如果未能解决你的问题,请参考以下文章