【问题标题】:Polymorphism, Parametric Polymorphism, Ad Hoc Polymorphism多态性,参数多态性,即席多态性
【发布时间】:2016-03-19 02:09:37
【问题描述】:

我试图找出这些类型的多态性之间的区别。我找不到很多关于 Ad-Hoc Polymorphism 的资料。

我想说多态是参数多态但一般只是简称为多态?我的假设是否正确?

我知道多态性可以用于继承,但我不确定它还可以提供哪些其他属性。

如果有人可以帮助定义这些类型的多态性并尝试给出明显的差异,那就太好了。

谢谢!

注意:Python 中的每个示例都会很棒。

【问题讨论】:

  • 几个月前我回答了一个非常相似的问题。 Take a look。我认为它包含对 Luca Cardeli 论文的参考是您正在寻找的。​​span>
  • 非常感谢!我现在去看看。

标签: polymorphism adhoc


【解决方案1】:

多态是一般概念。 Ad-hoc 多态性和参数多态性是该概念的特化。 (根据the relevant Wikipedia article,还存在其他类型的多态性。)

即席多态也称为函数重载,它指的是使用类型系统来精确解析将调用哪个方法。因此,我们可能有两个函数,都称为fn,其中一个接受int 参数,而另一个接受String 参数,并根据传递的参数类型选择要调用的正确函数。

参数多态基本上是使用泛型。所以,Collection<T> 接口可以说是多态的,因为它可以用作Collection<Integer>Collection<String> 等等。名称“参数”是指通用参数的存在。

据我所知,python 没有强大的类型概念,也不支持泛型(C++ 用语中的“模板”),因此这些概念可能不适用于 Python。但是,我没有使用 Python 的实际经验,所以我可能错了。也许其他人可以启发我们。

【讨论】:

  • 好的,谢谢!所以要确保我理解它:参数多态性是使用泛型,它允许将任何类型传递给函数并由该函数处理?在 ML 中,我可以做 fun gen x = x; val gen = fn : 'a -> 'a. 然后我可以用整数或实数调用 gen,它会适当地处理它。我仍然对 adhoc 不确定,但我会环顾四周,看看是否能找到任何示例。谢谢!
  • @ChrisMulheron 很抱歉,因为我的目标是清楚地解释这些事情,显然,如果您仍有疑问,我没有做到这一点。我不知道 ML 是什么(机器学习?)而且我不理解 fun gen x = x; ... 语法。也许这个问答会对你有所帮助:stackoverflow.com/questions/6725868/…
  • 大多数情况下,您很难掌握这些概念,因为所有这些多态性都是由 python 免费提供的,由于使用了鸭子类型,所以您看不到替代方案是什么。 (鱼知道它是湿的吗?)如果您使用的是 C++、Java、C# 等强类型语言,您就会明白。
  • 别担心,有很多不同的例子我可能只是混淆了!我有一个例子:x = 5 + 5; y = 5.0 + 5.0, print(x,y) => 10, 10.0; 这是临时的例子吗? '+' 运算符同时处理整数类型和浮点数?在 ML 中,您必须对整数 ('div') 和 reals('/') 使用两个单独的除法运算符,这是否是显示 ML 中不存在 adhoc 的示例?抱歉,如果我晦涩难懂。
  • 是的,准确地说,同一个算子适用于不同类型是多态性,而不同类型需要不同的算子是缺乏多态性。
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
相关资源
最近更新 更多