Type和Class有什么区别?


Answers:


121

以下答案来自Gof书(“ 设计模式”

对象的定义了对象的实现方式。该类定义了对象的内部状态及其操作的实现。

相反,对象的 类型仅引用其接口-可以响应的一组请求。

一个对象可以具有许多类型,而不同类的对象可以具有相同的类型。

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
{
return a>b?a:b;  //> operator of the type is used for comparison
}

max函数需要一个类型为operation>且具有其自身类型的类型作为其接口之一,满足上述要求的任何类均可用于为该类生成特定的max函数。


56

我一直认为“类型”是“阶级”和“原始人”的总称。

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass


7
简洁明了的解释:)
aku

3
好吧,在.NET中,它应该是相同的,即使基元是类(或更确切地说是结构)。
dalle

4
@dalle:同意,类型和类之间没有固有的区别。Eddie的示例非常依赖C ++ / Java。这根本不是定义。
罗伯特·古尔德

我想很难获得“类型”与类的“ THE”定义。如此众多的语言都有自己的打字系统。我对.NET听到的一个定义是,“类型”既包含引用类型又包含值类型,而一个类仅用于描述引用类型。
艾迪·帕克

2
int不仅仅是System.Int32的简写吗?换句话说:int foo; //类型为int,类为System.Int32?
Svish

51

维基百科启发...

类型论的术语

  • 类型是一个抽象接口。
    类型通常代表名词,例如人,地点或事物,或名词化的事物,

  • 表示的类型的实施方式。
    它是一个具体的数据结构和子例程的集合

    不同的具体类可以产生相同抽象类型的对象(取决于类型系统)。

    *例如,一个人可能用两个来实现该类型 :(对于小堆栈,速度很快,但是伸缩性很差);(对小堆栈,比例很好,但开销却很大)。*StackSmallStackScalableStack

    同样,给定的类可能具有几个不同的构造函数

在此处输入图片说明

香蕉的例子。

  • Banana 类型将代表一般的香蕉的性质和功能。

  • ABCBananaXYZBanana 会代表生产香蕉的方式。
    (现实生活中不同的香蕉供应商,或在视频游戏中表示和绘制香蕉的不同数据结构和功能)。

    所述ABCBanana然后类可以产生特定香蕉其是 实例的的ABCBanana ,它们将对象类型香蕉

程序员经常为类型提供单个且唯一的实现。在这种情况下,名通常与类型名相同。但是仍然有一个类型(可以根据需要将其提取到接口中)和一个实现(将实现单独的接口)来构建类的实例(对象)。


3
作为一个努力学习的人,除非给出真实的例子,这确实对我有所帮助。谢谢。
alexc95

13

类型是所有可用对象模板或概念的总称。类就是这样的对象模板。结构类型,整数类型,接口类型等也是如此。这些都是类型

如果需要,可以这样看:类型是父概念。所有其他概念:类,接口,结构,整数等都继承自这个concept.ie,它们是类型


4

类型包含对数据的描述(即属性,操作等),

类是一种特定的类型-它是创建对象实例的模板。

严格来说,类是一个特殊的概念,它可以看作是一个包含描述对象某些方面的元数据子集的包。

例如,在C#中,您可以找到接口和类。它们都是类型,但是接口只能定义一些协定,并且不能像类一样实例化。

简单来说,是一种专用类型,用于封装对象的属性和行为。

维基百科可以为您提供更完整的答案:


4

为了说明它最快的方法:

结构是类型,但结构不是类。

如您所见,类型是一个“抽象”术语,不仅表示类的定义,而且还表示诸如float,int,bool之类的结构和原始数据类型。


2
可以提到.net CLR作为框架的示例,该框架中存在不是类的类型(尽管.net具有更多类型,但可以引用Java作为另一种类型)。但是,.net的一个小问题是Type(大写显示)是系统类(System.Type)的缩写,用于保存类型的描述。
supercat 2012年

3

类型在概念上是类的超集。从广义上讲,类是类型的一种形式。

与类密切相关的是接口,可以将其视为一种非常特殊的类-一种纯粹的抽象类。这些也是类型。

因此,“类型”也包含类,接口以及大多数语言中的基元。点网CLR等平台也具有结构类型。


rajKumar,您的问题很模糊。您是否将“类型”作为某种语言的特征或作为一般概念?
aku

但是,并非所有用户定义的类型都是类,至少不是所有语言都是如此。
jalf

杰夫,同意这是一个错误的特征。接口也是用户定义的,并且不能有用户定义的类型。类是一种特殊类型的服务特殊需求(创建对象的实例)
阿克苏

接口只是一个特殊类型,一个纯粹的抽象类-它仍然是一个类型(从更大的意义上来说)。
劳伦斯·多尔

软件猴子,接口不是纯粹的抽象类-它是一个特殊的概念。“用户定义的”不是一个类的定义性质
AKU

3

再加上另一个区别的例子:在C ++中,您有可以引用类的指针和引用类型,但它们本身不是类。

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

请注意,仅涉及一个类,但是可以使用几乎无限数量的类型。在某些语言中,函数被视为“第一类对象”,在这种情况下,函数的类型为类。在其他情况下,函数的类型仅是指针。类通常具有能够保存数据以及对该数据进行操作的概念。


3

我的想法与aku的回答基本一致。

我将类视为构建对象的模板,而类型则是对这些对象进行分类并为其提供接口的一种方式。

Python还添加了元类,它只是建立类的一种机制,与类建立对象的方式相同(当然,类和元类都是对象)。

这种反应在兰巴最终同样的问题,在我看来,像一个完美的解释。


3

摘自以下GoF引用:

对象的定义了对象的实现方式。该类定义了对象的内部状态及其操作的实现。

相反,对象的 类型仅引用其接口-它可以响应的请求集。

我想提供一个使用Java的示例:

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

这两个类AB实现该接口并且因此所述类型的IType。此外,在Java中,两个类都产生自己的类型(分别对应于其类名)。因此,该类A是类型A IType并且该类B是类型B IType满足:

一个对象可以具有许多类型,而不同类的对象可以具有相同的类型。

子类型和子类之间的差异也可能有助于理解该问题:

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html


2

我认为类型是可以使用特定值执行的一组操作。例如,如果您具有整数值,则可以将其添加到其他整数(或执行其他算术运算),或将其传递给接受整数参数的函数。如果有对象值,则可以在其上调用由其类定义的方法。

因为一个类定义了您可以使用该类对象的功能,所以一个类定义了一种类型。但是,一个类不止于此,因为它还提供了有关如何实现方法(类型未暗示的内容)以及对象字段的布局方式的描述。

还要注意,一个对象值只能具有一个类,但是可以具有多种类型,因为每个超类都提供该对象类中可用功能的子集。

因此,尽管对象和类型密切相关,但它们实际上并不是一回事。


2

C中的类型(如Int Float,char等)定义了可以通过可对它们进行操作的特定方法对其进行操作的数据。没有比这更复杂的了。就像int一样,我可以加,减,乘,除。这些是我用于int的方法(或操作)。类只是对新类型的定义。我首先定义数据的外观。也许只是一点点。也许这是两个单词,就像一个具有真实和虚构部分的复合体。也许这很复杂,有309734325字节,代表木星上一个奇怪粒子的原子组成。我不在乎 就像整数一样,我可以弥补使用这种新数据类型可以执行的操作。对于整数,我要进行加,减等操作。使用这种新的数据类型,我可以定义我认为有意义的任何操作。它们可能是加减等。但他们可能会添加其他内容。这些是我决定添加到类中的任何方法。

最重要的是,使用C中的类型,您可以定义数据的含义,即:一个字节,一个字,一个浮点数,一个char等。但是这些都暗示着什么操作是合法的,并且会产生可靠的结果。

类没有什么不同,只取决于您定义接口和可接受的操作。该类定义了这些东西,当您在对象中实例化它时,它定义了对象的行为,就像类型定义定义了对整数进行操作时的行为一样。

类只是使您能够灵活地定义新类型以及有关它们如何操作的所有信息。

定义好之后,每次我实例化“ thingy”类的对象时,它就会具有我定义的数据结构以及我说过可以使用的操作(方法)。“ thingy”类显然只是C ++允许我定义的一种新类型。


1

类型通常是指原始值的分类-整数,字符串,数组,布尔值,空值等。通常,您不能创建任何新类型。

是指对象创建时与之关联的一组命名的属性和方法。尽管必须使用某些语言来创建一个新对象,然后将方法附加到该对象,但是通常可以定义任意数量的新类。

这个定义大体上是正确的,但是某些语言已经尝试以各种方式组合类型和类,并产生各种有益的结果。


1
甚至在类型贫乏的语言C中,您也可以创建新的类型,但是它与人们通常认为的类没有什么不同,除了结构,记录和类彼此非常相似之外。
James Iry 2012年

1

类型和类是相关的,但不完全相同。我的观点是,类用于实现继承,而类型则用于运行时替换。

是解释替换原理以及为什么子类和子类型并不总是相同的原因的链接(例如在Java中)。有关协方差和相反方差的维基百科页面提供了有关此区别的更多信息。


1

一般的语言无关的感觉- 实现了的类型

通常,当这是该类型的唯一实现时,可以在某些情况下使用这两个术语来引用它。

相反,例如,在C#中的上下文- 只是一个对的更多 实现一个的类型像元,结构,指针等概念


0

有趣的问题。我认为aku的答案是正确的。以java ArrayList类为例

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList该类的实例被认为是其扩展的每个超类以及其实现的每个接口的类型。因此,的实例ArrayList类有一个类型ArrayListRandomAccessCloneable,等等。换句话说,值(或实例)属于一种或多种类型,类定义了这些类型是什么。


0

不同的类可能描述相同的类型。

类型由以下部分组成:

  1. 操作=语法
  2. 操作说明=语义

类包括以下部分:

  1. 操作=语法
  2. 实现(=各种实现描述相同的语义)

一些注意事项:

  • 接口(如Java)不是类型,因为它不描述语义(仅描述语法)

  • 子类不是子类型,因为子类可能会更改超类中定义的语义,所以子类不能更改超类语义(请参阅Liskov替换原理,例如此LSP示例)。


0

显然,由于类型系统中的语言不是OO编程语言,因此类型必须比更广泛的概念

即使在Java之类的语言中,int它也是(原始)类型,而不是类。

因此:每个类都是一个类型,但不是每个类型都是一个类。


0

如果我们在C#上下文中思考这个问题,我们将得到下面的答案。

C#类型系统分为以下几类:

值类型:

  • 简单类型:例如int,long,float等。
  • 枚举类型
  • 结构类型
  • 可空类型

参考类型:

  • 类类型
  • 接口类型
  • 数组类型
  • 代表类型

如您所见,C#中有许多类型,而Class仅是其中之一。有一个重要的注意事项:C#的类型系统是统一的,因此任何类型的值都可以视为对象。C#中的每个类型都直接或间接地源自对象类类型,而object是所有类型的最终基类。只需将值视为类型对象,即可将引用类型的值视为对象。通过执行装箱和拆箱操作,值类型的值被视为对象。

因此,正如我所见,类型是许多项目的保护伞,而类别是其中之一。

裁判:CSahrp语言规范文档,第4页


-1

这对我来说是个好问题,这使我很难思考。我敢说类是编译时,而类型是运行时。我说这是因为您编写的是类而不是类型。然后,编译器根据类创建类型,运行时使用类型创建对象的实例。


1
欢迎来到SO。这个答案至少与其他答案非常相似,因此,用户比“ thingy”更喜欢技术性语言!
尼克,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.