Windows窗体通用继承
本文关键字:继承 窗体 Windows | 更新日期: 2023-09-27 18:17:28
我有这些类:
class Foo<T1, T2> : Form
where T1, T2 : EventArgs
class MiddleGoo : Foo<X,Y>
class Goo : MiddleGoo
X,Y只是从EventArgs派生的简单类。
我在设计器中看到Goo,但我想在Foo和Goo之间创建一个类Boo,像这样:
class Boo<T1, Y> : Foo<T1, Y>
where T1 : EventArgs
class MiddleGoo : Boo<X,Y>
class Goo : MiddleGoo
中产阶级的解决方案不起作用,有什么想法吗?
编辑:我的意思是Y和X是类像YEventArgs和XEventArgs和我的问题是看到在设计师类Boo当我定义Y为T2,但仍然希望通过T1保持它的通用。
我刚意识到我拼写错了关于Y类的一些东西。
public class Foo<T1, T2> : Form
where T1 : EventArgs
where T2 : EventArgs
{
}
public class Boo<T1> : Foo<T1, MyEventArgs2>
where T1 : EventArgs
{
}
public class MiddleGoo : Boo<MyEventArgs1>
{
}
class Goo : MiddleGoo
{
}
public class MyEventArgs2 : EventArgs
{
}
public class MyEventArgs1 : EventArgs
{
}
澄清一下,我在Designer中看不到Boo…(我不能看到MiddleGoo,但我不需要)
For Visual Studio Version>= VS2015.1
从VS2015.1开始,Windows窗体设计器显示具有通用基类的类,没有任何问题。因此,其他帖子中的解决方案对于新版本的VS不再需要,下面的类将在设计器中显示,没有任何问题。
所以有一个像这样的基类:
public class BaseForm<TModel,TService> : Form
{
public TModel Model {get;set;}
public TService Service {get; set;}
}
您可以在设计器中创建派生表单,而不会出现任何问题:
public class FooForm: BaseForm<Foo,FooService>
{
}
旧版本的Visual Studio
在旧版本的Visual Studio中,当设计器想要在设计器中托管窗体时,它会尝试创建窗体基类的实例,并且您的类必须具有非泛型基类,以便设计器可以显示它。
所以你可以看到BaseForm<T>:Form
可以在设计器中显示,但CategoryForm:BaseForm<Category>
不能在设计器中显示。在这些情况下,作为一种解决方案,您应该创建一个BaseCategoryForm:BaseForm<Category>
,然后CategoryForm:BaseCategoryForm
将在设计器中显示。
假设这是你的基类,接受TModel作为Model, TService作为Service,例如:
public class BaseForm<TModel,TService> : Form
{
public TModel Model {get;set;}
public TService Service {get; set;}
}
然后用下面这行代码以这种方式创建一个中间表单:
Public Class BaseFooForm: BaseForm<Foo, FooService>{ }
最后的形式是:
public class FooForm: BaseFooForm
{
}
现在最终的FooForm
有了设计器,你可以正常使用它了。这样,您就可以创建在设计器中支持的类。
注意
此更新也应用于控件设计器。所以在WinForm UserControl的通用基类中,你不再需要VS>= VS2015.1
。
Foo
类中的T2
Type参数需要转换为EventArgs
。但是,当您定义Boo
类时,您不包括该约束。将Boo
类更改为:
class Boo<T1, Y> : Foo<T1, Y>
where T1 : EventArgs
where Y : EventArgs
另外,在Foo
类声明处有一个语法错误。改为:
class Foo<T1, T2>
where T1 : EventArgs
where T2 : EventArgs