Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 接口属于特殊多态性(即重载)还是子类型多态性?_Oop_Haskell_Polymorphism_Subtyping_Adhoc Polymorphism - Fatal编程技术网

Oop 接口属于特殊多态性(即重载)还是子类型多态性?

Oop 接口属于特殊多态性(即重载)还是子类型多态性?,oop,haskell,polymorphism,subtyping,adhoc-polymorphism,Oop,Haskell,Polymorphism,Subtyping,Adhoc Polymorphism,说 特殊多态性指的是一个值能够采用几种类型中的任何一种,因为它或它使用的一个值已经为每种类型给出了单独的定义。例如,+运算符在应用于浮点值时与应用于整数时本质上完全不同–在Python中,它甚至可以应用于字符串。大多数语言至少支持一些特定的多态性,但在像C这样的语言中,它仅限于内置函数和类型。像C++这样的其他语言允许程序员提供他们自己的重载< /强>,提供单个函数的多个定义,以参数的类型来消除歧义。在Haskell中,这是通过类型类系统和类实例实现的 尽管名字很相似,Haskell的类型类却非

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

尽管名字很相似,Haskell的类型类却非常相似 与大多数面向对象语言的类不同。他们 与接口有更多共同点,因为它们指定了一系列 方法或值的类型签名,由 实例声明

这是否意味着类型类是实现重载的一种方法,即特殊多态性

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

  • 由于类型类类似于接口,接口是否是实现重载的一种方式,即即席多态性,就像类型类一样

  • 接口是否和基类相似,接口是否也是实现子类型多态性的一种方式,就像类继承一样


谢谢。

类型没有类型层次结构,但是类型类

我不认为类型类是类继承,因为没有父结构,只有签名。它们可以被看作是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);