通用类型与抽象类/接口

时间:2009-07-08 09:00:45

标签: generics interface abstract-class

假设我们在.NET中创建通用控件。例如。一颗树。 我不明白为什么人们使用这种泛型类型定义

Control<T>

在面向对象编程中我可以使用抽象类或接口:

Control<IItem> or Control<BaseClass>

所以唯一要做的就是,它们的类型必须从该基类派生或实现 接口。 这是否意味着,泛型类型更方便,因为您不必实现或继承任何东西?

2 个答案:

答案 0 :(得分:17)

我觉得你有点困惑。通用类型和抽象类/接口为应用程序设计中的不同方法提供不同的目标。抽象类/接口用于概括一组实体的通用功能。稍后,这个API可以以不同的方式实现,但由于涉及多态性,它不会影响任何人。

另一方面,有时候你有一个非常类似的东西实现,唯一的区别是你正在使用的对象的类型。在这里你需要一个通用的。你可以使用多态,但没有必要。为此,只需定义一个接口,进行实现,让最终用户决定使用哪种对象就更清楚了。

最好的例子是List,其中list的主要目的是存储元素。 List实现者不应该关心您将使用哪种类型的对象,因此稍后您将只能定义List并使用整数列表。

答案 1 :(得分:3)

因为在树控件的情况下,定义一个通用的Tree控件意味着Tree项可以是任何类型(你也可以添加某些约束)。

在实例化控件时,您当然必须声明您的商品类型(例如您的第二个代码示例中包含IItemBaseClass)。

如果您的Tree控件不是泛型类型,则必须为每个项类型创建多个控件。

为什么不使用interface / abstractBase类型?
如果你只是使用一个接口/抽象作为你的Item具体类,你将受到它的定义的约束。你只会看到它的属性和方法。使用通用树控件和任何项类型,无论其接口实现或父类继承如何,您仍然可以访问所有项的属性和方法......