我通过强制模块实现一个抽象类来实现我的模块系统,该抽象类包含将由基础应用程序调用的强制方法。现在我想实现每个模块的配置表单。我想过将表单的类型作为模块骨架类的属性返回:
public abstract class Module
{
public abstract Type ConfigurationForm { get; }
}
显示配置表单时,我只是实例化此类型的表单并调用Show()
方法。
问题是,我想强制模块返回一个类型,它是System.Windows.Forms.Form
的子类,否则调用会失败。执行此操作的正确方法是什么?
我想过将ConfigurationForm属性封装在另一个属性中,该属性检查它是否继承自Form
,但我不认为这是一种干净的方法来实现这一点。
答案 0 :(得分:6)
您可以使用泛型类型参数
来完成此操作public abstract class Module<F> where F : Form
{
public Type ConfigurationForm { get { return typeof(F); } }
}
但实际上这可能更有意义:
public abstract class Module
{
public abstract Form CreateConfigurationForm();
}
编辑:使用第二个选项的优点是你可以编写代码来使用你的Module类,而不必具体知道你正在处理哪种模块
答案 1 :(得分:1)
无法限制函数返回Type
,它表示继承自Form
的类型。您可以做什么直接返回表单:
public abstract Form CreateConfigurationForm();
或工厂方法(或工厂类):
public abstract Func<Form> ConfigurationFormCreator();
另一种选择是使用泛型,就像时代所暗示的那样。