【问题标题】:Is generic programming an example of polymorphism?泛型编程是多态的一个例子吗?
【发布时间】:2010-03-27 20:51:08
【问题描述】:

我正在做一个家庭作业(一个项目),其中一个标准是我必须以显着提高代码的整体质量或功能的方式使用多态性。

我制作了一个哈希表,如下所示:

public class HashTable<E extends Hashable>{
    ...
}

其中 Hashable 是我制作的具有 hash() 函数的接口。

我知道以这种方式使用泛型可以提高我的代码质量,因为现在 HashTable 几乎可以处理我想要的任何类型(例如,而不仅仅是整数或字符串)。但我不确定它是否证明了多态性。

认为确实如此,因为 E 可以是任何实现 Hashable 的类型。换句话说,HashTable 是一个可以(实际上)使用任何类型的类。

但我不太确定 - 多态性吗?也许我可以澄清一下究竟什么是多态性?

提前致谢!


编辑:收到下面的答案后(见:first answer received),我阅读了维基百科的文章,发现了这个:

“在面向对象的编程社区中,使用参数多态的编程通常称为泛型编程。” (强调)

【问题讨论】:

  • +1:希望我们已经超越了这不是常识,现在 - 当我在学校时,当我提到参数多态性时,我的老师们都瞪大了眼睛。坚持你的枪,如果他们试图标记你。
  • 谢谢马克斯。顺便说一句,这是一个高中班。我们没有在课堂上学习泛型(我倾向于学习,因为我想要类似于 c++ 中的模板类)。既然是高中班,如果不是泛型的话,多态性可能是什么意思?

标签: java generics polymorphism


【解决方案1】:

简而言之,多态性就是采用许多共享公共基类(或接口)的不同类,并将它们全部视为该公共基类的成员,而不知道或关心它们是哪个特定的继承类或它们的精确度实现常用功能。在面向对象编程中,多态性为您提供了问题域的那部分的相对高级视图——您是说,“这段代码不关心这些对象的具体细节——只是它们实现了一些常见的功能 X ,Y,Z”或“只是它们都是基本类BaseClass.

您的示例使用了多态性,因为您定义了一个 Hashable 基类 - 并提供了一个只关心它接收到的对象的那个方面的函数。 Hashable 对象可能有多种形式,但您的代码将它们全部视为一个基本类型。

【讨论】:

  • 已将最佳答案切换到此答案 - 这直截了当,非常有帮助;谢谢!
【解决方案2】:

是的,它叫做parametric polymorphism。您将其归类为多态性的理由是正确的。

【讨论】:

  • +1:希望提问者的老师不会因为他想到了一些他们没有想到的东西而将他记下来,但这不会改变您答案的 +1 或提问者评估的 +1。
  • 只要学生将其称为“参数多态性”并给出清晰的推理原因和方式,那么他应该没问题。如果老师给他打分,那么老师真的不应该教。
【解决方案3】:

除了参数多态性之外,您可能还会调用存储在哈希表中的对象的 hashCode 方法,这是 John 所指的多态性的一个示例。 HashTable 依赖于参数多态性,而 E 依赖于(普通)多态性。

【讨论】:

    【解决方案4】:

    虽然 Rob 的回答在某种技术意义上可能是正确的,但我认为这不是所要求的。我认为这个wikipedia article 更有可能是您所需要的。

    【讨论】:

    • @CS Student:泛型编程与更“经典”的多态性有一些重要区别。模板代码基本上为您调用代码的每种类型生成一个新的类/函数。泛型编程通常不会说“此代码仅在其公共基类级别引用对象”,而是说“您可以将任何类型名插入此代码中,它会起作用”——没有公共基类,不依赖代码可以处理的多种形式的任何共同点。
    • (续)在您的示例中,您避免了这种情况,因为您将“任何类型名称”限制为类型名称的子集,它本身就是多态的。还有其他区别(例如,经典多态可以动态处理不同的类,而模板必须在编译时实例化 - 您不能将模板实例化为在程序运行期间确定的类型名)。
    • 您的 HashTable 将对象的子类视为对象,因此在技术上是多态性。我也同意泛型是有用的并且在道德上是好的。但是,我仍然不认为这是一个很好的例子:我认为学生很难通过这个例子来学习多态性。在我看来,一个适当的多态示例需要两个不同的子类(作为超类的实例)由一段代码来操作。你可以选择一个边缘(?)的例子,很高兴你比老师知道得更多,并且可能不得不为你的分数争论。
    • 对 - 我认为,单独使用模板会更加不确定。由于他将 Hashable 的子类视为 Hashables,我认为他很清楚 - 这就是我要强调的地方。
    猜你喜欢
    • 2011-06-25
    • 2011-02-22
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多