我试图以语义的方式理解泛型。例如,当我读到人们将抽象类称为可以设置策略的结构时,抽象类似乎对我来说就位。当我读到人们将它们称为协作合同时,界面就被抢购一空。
有哪些思考泛型的好方法可以帮助我将它们与其他 OO 结构区分开来并编写更智能的 API?
将泛型类视为制作其他类的模板(类似地,泛型函数是制作其他功能的模板)。类型参数充当模板中的开口:通过将具体类型插入其中,您可以将泛型类或泛型函数变成真正的类或函数。类型参数“穿过”模板中的指定孔,产生完整的定义。
您似乎想从自上而下的角度来理解您的理解。定性意义上的“它是什么”,然后从那里得出真正的含义。简单地了解这些不同的构造做什么而不是尝试提出标签不是更容易吗?即从自下而上的角度处理它,并从您现在已经直接了解的内容中推断出您自己的定性描述。
抽象类要求你实现一个属性或方法,并且不能被实例化。它与接口有什么区别?它需要子类来选择你的作为它唯一的基类。接口没有这样的限制,但需要您在实现中定义它的整个行为,而不是依赖于要在基类中定义的某些行为。
同样,泛型允许您将类型作为可以由调用者指定的变量引入。它的实用性与一般的方法参数类似,只是提升到了更高的水平。换句话说,方法参数允许您根据调用者指定的某些输入来改变实现。通用参数允许您根据调用者指定的某些(其他)输入(即类型)来改变实现。
当然很清楚为什么List<T>
比ArrayList
. 我不太确定为什么隐喻真的有助于理解原因。
您可以将它们视为对象类型的包装器。您正在创建的函数将为实例化的任何类型的对象执行某些操作,因此它就像一个模板,将为多种类型的对象执行相同的工作。
微软对泛型的介绍可能也有一些很好的描述
http://msdn.microsoft.com/en-us/library/ms379564(v=vs.80).aspx