当前位置: 首页 > 知识库问答 >
问题:

接口属于ad hoc多态(即重载)还是子类型多态?

车胤运
2023-03-14

https://wiki.haskell.org/polymorphism说

特别多态性是指当一个值能够采用几种类型中的任何一种时,因为它或它使用的值已经为这些类型中的每一种类型赋予了单独的定义。例如,+运算符在应用于浮点值时所做的事情与应用于整数时完全不同--在Python中,它甚至可以应用于字符串。大多数语言至少支持一些特殊的多态性,但在像C这样的语言中,它仅限于内置的函数和类型。其他语言,如C++,允许程序员提供自己的重载,提供单个函数的多个定义,通过参数的类型来消除歧义。在Haskell中,这是通过类型类和类实例系统实现的。

OO语言(如Java、C#)中的接口属于哪种多态性,是ad hoc多态性(即重载)还是子类型多态性?

>

  • 既然类型类与接口相似,那么接口是否像类型类一样是实现重载(即ad hoc多态性)的一种方式?

    接口是否类似于基类,那么接口是否是实现子类型多态的一种方式,就像类继承一样?

    谢了。

  • 共有1个答案

    百里阳平
    2023-03-14

    Types没有类型层次结构,但Typeclasses有。

    我不认为类型类是类继承,因为你没有父结构,你只有签名。它们可能被视为OOP语言的经典接口,某种程度上...

    但正如你引用的文字所说:

    plus :: Num a => a -> a -> a
    plus x y = x + y
    
    (/) :: Fractional a => a -> a -> a
    
    (div) :: Integral a => a -> a -> a
    
    (+) :: Num a => a -> a -> a
    

    其中每一个都有自己的实现,并限制子类型和超类型的类型层次结构中可以使用的数据类型,总是讨论typeClass,而不是类型本身。

    关于与OOP的关系:

    例如,在Java中,类型和类完全不同。看:

    List<String> xs = new ArrayList<>();
    List<String> ys = new LinkedList<>();
    xs.add("Haskell");
    ys.add("Forever");
    
    ArrayList<String> ls = new ArrayList<>();
    ls.add("something);
    

    Haskell中有一个典型的有用的typeClass层次结构示例:

     类似资料:
    • 下面的例子属于哪个概念:方法重载还是方法重写???

    • 我有一个可以简化如下的场景: 我有一个名为AbstractField的抽象类 < li >可以有许多从此类扩展的类:CurrencyField、DecimalField等。 < li >现在我有一个通用接口FieldDBStore来创建或更新数据库中的字段详细信息。 < li >我想为每种类型的字段实现上述接口(每当它以不同方式存储时)。 以下是一些代码示例: 对于抽象字段 对于货币字段 对于Fi

    • 最近在一次采访中,我被问到,“Java中的动态多态性示例是什么?” 我回答:“方法覆盖”。 然后,面试官问:“是否有任何压倒一切的概念不属于动态多态性?” 这真的是个好问题吗?如果是,答案是什么? 提前感谢。

    • 我试图了解使用接口的好处是什么,以便我可以知道何时以及如何使用它们。互联网上的大多数资源都是相对表面的,解释了接口是如何工作的,但现在为什么要使用它们,当我查找名义上的问题时,我没有得到任何结果告诉我接口的目的是否超出了多态性和多重继承。 我的推理是,如果一个接口只被一个类继承,它将是无用的,当一个接口被多个类继承时,它没有区别,除非它用于多态,唯一使实现不同于扩展的是多重继承。 如果我确实知道他

    • 从Selenium文档来看,WebDriver是一个接口,但在Eclipse中是包在项目浏览器中显示为一个类。此外,如果WebDriver是一个接口,则实现它的类(如ChromeDriver或InternetExplorerDriver)应该定义或。我们在哪里可以看到这些方法的方法定义?

    • 问题内容: 我确实知道重载和重载之间的语法差异。而且我也知道,重载是运行时多态,重载是编译时多态。但是我的问题是:“重载真的是编译时的多态性吗?方法调用真的在编译时解决了吗?”。为了阐明我的观点,让我们考虑一个示例类。 由于所有方法都是公开的,因此可以全部重写(包括重载的方法),对吗?例如, 现在,考虑以下代码片段: 该方法返回一个随机对象。它可以返回的对象,或者它的任何子类,例如或或任何其他一个