我在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 变量并调用 PopulateData()即可。
像这样: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设计器搞砸了,显示了以下页面。
如何摆脱这种情况,我的目的也会在不妨碍设计师的情况下实现?
答案 0 :(得分:1)
不要使EXTENDED_FORM抽象;从其声明中删除abstract并添加不带参数的受保护构造函数