这个问题已经在这里被问了好几次,但没有一个回复真的以更抽象的理论意义回答它。
大多数答案都是这样的:“一个类具有其对象可以响应的方法的实现,而一个类型只指定哪些方法可以响应”。
嗯,这对我来说似乎有些奇怪的定义。使用像C这样的语言来获取整数,浮点数和字符。它可能永远不会明确地位于代码中,但肯定有语言内置的方法来响应消息(“加”,“减”等)这些类型接收。
由于所有接口都必须具有某处定义的方法,因此在我看来,类型与类相同,除了“类”这个词带有比实体编程结构更精彩的心理图像。一个“类型”。
这使我相信适用于任何基于类的语言(例如“表达式问题”)的缺点同样适用于任何具有类型的语言(Haskell等)
答案 0 :(得分:0)
简单地说,一个类通常会有一些方法来操作实例中包含的数据。一种类型不会;它只是用于保存和返回数据。
虽然确实可以在某处为类型指定方法,但只有一种方法可以更改类型实例中包含的数据 - 在其中存储新值。这些方法通常沿着以不同方式呈现数据的方式,而不是实际操作数据。
这条规则当然可以打破;由于结构(或者更确切地说,没有结构化),C充满了示例。但是,一般来说,您不希望某个类型具有在内部执行奇特逻辑的函数。
答案 1 :(得分:0)
我所知道的“类”这个术语没有广泛适用的,普遍接受的定义,甚至不是类型系统。所以你的问题在很大程度上取决于背景。
如果您正在讨论面向对象语言中的类,那么您引用的描述相对准确。类型是规范,描述(对象或其他值)。类是实现,(对象工厂的)定义。
但是,在许多面向对象语言中,类定义还引入了不同的类型名称,这些类型名称通常是键入对象的唯一方法。这是一个令人遗憾的限制和概念的混合,这也导致了众所周知的confusion of subtyping and inheritance。至少一些语言适当地分离这些概念,例如, Ocaml
在任何情况下,区别似乎与C中的整数和浮点数不一致的原因很简单:那些不是对象。尽管OO意识形态试图传播,但并非一切都是一个对象,当然也不是每种语言。
答案 2 :(得分:0)
"级"和"键入"在不同的语言和环境中表示不同的东西;我将尝试在这里展示一个综合,帮助我思考这个问题。
类具有对象,类型具有值。我认为理解对象和值之间的差异比在类和类型之间更容易理解。对象具有2个独立属性:其标识及其状态/行为。因此,您可以拥有两个具有相同类和状态的不同对象。对于值,情况并非如此:您不能拥有两个具有完全相同状态(或形式,形状)和行为的类型的不同值:您不能拥有2"两个"。类型的值不具有独立于其状态和行为的标识。
将两个概念混合在一起,您可能会说给定类型的值不一定具有类,但给定类的对象必然具有类型(例如,对象),并且其值由其两者给出国家/政府及其身份。
Haskell有类型,如果我是正确的,可以定义。来自Haskell,我正在采用"类型"我正在使用的概念。 Python将类和类型混合到相同的"类型"系统,具有一些原始类型和丰富的可定义类。我使用的对象的概念是Python类型系统的概念,减去它的原始类型:int,str等。
类型和类之间的另一个关键区别在于它们的定义。类型由一组谓词或约束来定义,这些谓词或约束给出了"一下子所有类型的值。因此,您可以使用文字值,而无需先创建"创建"它:23438573。类的定义涉及创建对象的过程,该类的所有对象必须在使用之前创建。