如何在C#中扩展表单类?

时间:2015-01-30 11:20:36

标签: c# winforms visual-studio-2010 inheritance

我在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设计器搞砸了,显示了以下页面。

如何摆脱这种情况,我的目的也会在不妨碍设计师的情况下实现?

1 个答案:

答案 0 :(得分:1)

不要使EXTENDED_FORM抽象;从其声明中删除abstract并添加不带参数的受保护构造函数