代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

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

  •  0
  • Tim unnamed eng  · 技术社区  · 5 年前

    https://wiki.haskell.org/Polymorphism

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

    尽管名字很相似,哈斯克尔的 有更多共同点 ,因为它们指定了一系列 方法或值的类型签名,由

    这是否意味着类型类是实现重载的一种方式,即即席多态性?

    面向对象语言(如Java、C)中的接口属于什么样的多态性,即席多态性(即重载)还是子类型多态性?

    • 由于类型类和接口类似,接口是否像类型类一样是实现重载(即席多态)的一种方法?

    • 接口是否与基类相似,那么接口是实现子类型多态性的一种方法,就像类继承一样?

    0 回复  |  直到 5 年前
        1
  •  3
  •   developer_hatch    5 年前

    类型 类型类 有。

    我不认为类型类是类继承,因为没有父结构,只有签名。它们可能被视为面向对象编程语言的经典接口,有点。。。

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

    例如 (+) 运算符应用于浮点值时与应用于整数时的操作本质上完全不同

    (+) 函数,与类型无关。

    你有一个 TypeClass Num 尊重。例如

    plus :: Num a => a -> a -> a
    plus x y = x + y
    

    你有(我能数)四个直接的亚型 Integral (实施单位 Int )以及 Fractional Float Double ). 分数的 TypeClass是的子类型 号码 类型类。

    (/) :: 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");
    

    那里的类型是 List ,但这些列表的行为由 等级 (ArrayList或LinkedList)。 更重要的是,您可以:

    ArrayList<String> ls = new ArrayList<>();
    ls.add("something);
    

    另一方面,在哈斯凯尔不是这样的 (+) 方法行为由 .

    类型类

    Typeclass Hierarchy: