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,但我不需要)

Windows窗体通用继承

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