7

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

Control<T>

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

Control<IItem> or Control<BaseClass>

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

4

2 回答 2

19

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

另一方面,有时您对某些东西的实现非常相似,唯一的区别是您正在使用的对象的类型。在这里,您将需要一个泛型。您可以使用多态性,但没有必要。为此目的,只需定义一个接口、实现一个实现并让最终用户决定使用哪种对象就更清楚了。

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

于 2009-07-08T09:19:54.967 回答
3

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

实例化控件时,您当然必须声明您的项目类型(如在第二个代码示例中使用IItemand BaseClass)。

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

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

于 2009-07-08T09:12:19.927 回答