Oop 接口属于特殊多态性(即重载)还是子类型多态性?
说 特殊多态性指的是一个值能够采用几种类型中的任何一种,因为它或它使用的一个值已经为每种类型给出了单独的定义。例如,+运算符在应用于浮点值时与应用于整数时本质上完全不同–在Python中,它甚至可以应用于字符串。大多数语言至少支持一些特定的多态性,但在像C这样的语言中,它仅限于内置函数和类型。像C++这样的其他语言允许程序员提供他们自己的<强>重载< /强>,提供单个函数的多个定义,以参数的类型来消除歧义。在Haskell中,这是通过类型类系统和类实例实现的 尽管名字很相似,Haskell的类型类却非常相似 与大多数面向对象语言的类不同。他们 与接口有更多共同点,因为它们指定了一系列 方法或值的类型签名,由 实例声明 这是否意味着类型类是实现重载的一种方法,即特殊多态性 面向对象语言(如Java、C#)中的接口属于哪种多态性,即席多态性(即重载)还是子类型多态性Oop 接口属于特殊多态性(即重载)还是子类型多态性?,oop,haskell,polymorphism,subtyping,adhoc-polymorphism,Oop,Haskell,Polymorphism,Subtyping,Adhoc Polymorphism,说 特殊多态性指的是一个值能够采用几种类型中的任何一种,因为它或它使用的一个值已经为每种类型给出了单独的定义。例如,+运算符在应用于浮点值时与应用于整数时本质上完全不同–在Python中,它甚至可以应用于字符串。大多数语言至少支持一些特定的多态性,但在像C这样的语言中,它仅限于内置函数和类型。像C++这样的其他语言允许程序员提供他们自己的重载< /强>,提供单个函数的多个定义,以参数的类型来消除歧义。在Haskell中,这是通过类型类系统和类实例实现的 尽管名字很相似,Haskell的类型类却非
- 由于类型类类似于接口,接口是否是实现重载的一种方式,即即席多态性,就像类型类一样
- 接口是否和基类相似,接口是否也是实现子类型多态性的一种方式,就像类继承一样
谢谢。类型没有类型层次结构,但是类型类有 我不认为类型类是类继承,因为没有父结构,只有签名。它们可以被看作是OOP语言的经典接口,有点 但正如你引用的文本所说: 例如,
(+)
运算符在应用于浮点值时,与应用于整数时,其作用本质上完全不同
像(+)
函数这样简单的东西,类型就不是这样了
这里有一个要尊重的TypeClass
层次结构Num
。比如说
plus :: Num a => a -> a -> a
plus x y = x + y
这里有(我可以计算)四个直接子类型Integral
(由Int
和Integral
实现)和fractive
(由Float
和Double
实现)<代码>整数和分数
类型类是Num
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");
是有效的,类型和类相同
另一方面,在Haskell中不是这样的,(+)
方法行为是由类型的实现根据其类型类给出的
Haskell中有一个经典的有用的Typeclass
层次结构示例:
是的,Haskell类型的类是实现特殊多态性的一种方法。C#或Java中的接口实现子类型多态性:实现接口的对象是该接口的子类型。这是因为子类型与Hindley-Milner类型推断不兼容。子类型是一个纯粹的OO概念。@带有类型类约束的AJFarmar rank-2类型基本上可以用来实现子类型。这通常不是一件非常实际的事情,但它可能非常强大,最突出的例子是@AJFarmar,相关地/更一般地说,包容可以被视为一种极其受限的子类型<代码>(适用于所有a.a->a)≤ (Int->Int)。Haskell中的类型不是类型类的子类型(例如Int不是Integral的子类型),因为类型类不是类型(例如Integral不是类型)。没有类型层次结构。有一个类型类层次结构。@n.m.非常感谢您帮助我改进我的答案,我已经采纳了您的建议并编辑了这个问题,我真的很想从您那里得到反馈,以了解它是否需要改进,或者现在是否还可以,非常感谢您的时间
ArrayList<String> ls = new ArrayList<>();
ls.add("something);