Answers:
以下答案来自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函数。
我一直认为“类型”是“阶级”和“原始人”的总称。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
受维基百科启发...
用类型论的术语
甲类型是一个抽象接口。
类型通常代表名词,例如人,地点或事物,或名词化的事物,
甲类表示的类型的实施方式。
它是一个具体的数据结构和子例程的集合
不同的具体类可以产生相同抽象类型的对象(取决于类型系统)。
*例如,一个人可能用两个类来实现该类型 :(对于小堆栈,速度很快,但是伸缩性很差);(对小堆栈,比例很好,但开销却很大)。*Stack
SmallStack
ScalableStack
同样,给定的类可能具有几个不同的构造函数。
香蕉的例子。
甲
Banana
类型将代表一般的香蕉的性质和功能。在
ABCBanana
和XYZBanana
班会代表生产香蕉的方式。
(现实生活中不同的香蕉供应商,或在视频游戏中表示和绘制香蕉的不同数据结构和功能)。所述
ABCBanana
然后类可以产生特定香蕉其是 实例的的ABCBanana
类,它们将对象的类型香蕉。
程序员经常为类型提供单个且唯一的实现。在这种情况下,类名通常与类型名相同。但是仍然有一个类型(可以根据需要将其提取到接口中)和一个实现(将实现单独的接口)来构建类的实例(对象)。
为了说明它最快的方法:
结构是类型,但结构不是类。
如您所见,类型是一个“抽象”术语,不仅表示类的定义,而且还表示诸如float,int,bool之类的结构和原始数据类型。
Type
(大写显示)是系统类(System.Type
)的缩写,用于保存类型的描述。
类型在概念上是类的超集。从广义上讲,类是类型的一种形式。
与类密切相关的是接口,可以将其视为一种非常特殊的类-一种纯粹的抽象类。这些也是类型。
因此,“类型”也包含类,接口以及大多数语言中的基元。点网CLR等平台也具有结构类型。
再加上另一个区别的例子:在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"
请注意,仅涉及一个类,但是可以使用几乎无限数量的类型。在某些语言中,函数被视为“第一类对象”,在这种情况下,函数的类型为类。在其他情况下,函数的类型仅是指针。类通常具有能够保存数据以及对该数据进行操作的概念。
我的想法与aku的回答基本一致。
我将类视为构建对象的模板,而类型则是对这些对象进行分类并为其提供接口的一种方式。
Python还添加了元类,它只是建立类的一种机制,与类建立对象的方式相同(当然,类和元类都是对象)。
这种反应在兰巴最终同样的问题,在我看来,像一个完美的解释。
摘自以下GoF引用:
对象的类定义了对象的实现方式。该类定义了对象的内部状态及其操作的实现。
相反,对象的 类型仅引用其接口-它可以响应的请求集。
我想提供一个使用Java的示例:
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
这两个类A
和B
实现该接口并且因此所述类型的IType
。此外,在Java中,两个类都产生自己的类型(分别对应于其类名)。因此,该类A
是类型A
, IType
并且该类B
是类型B
且 IType
满足:
一个对象可以具有许多类型,而不同类的对象可以具有相同的类型。
子类型和子类之间的差异也可能有助于理解该问题:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
C中的类型(如Int Float,char等)定义了可以通过可对它们进行操作的特定方法对其进行操作的数据。没有比这更复杂的了。就像int一样,我可以加,减,乘,除。这些是我用于int的方法(或操作)。类只是对新类型的定义。我首先定义数据的外观。也许只是一点点。也许这是两个单词,就像一个具有真实和虚构部分的复合体。也许这很复杂,有309734325字节,代表木星上一个奇怪粒子的原子组成。我不在乎 就像整数一样,我可以弥补使用这种新数据类型可以执行的操作。对于整数,我要进行加,减等操作。使用这种新的数据类型,我可以定义我认为有意义的任何操作。它们可能是加减等。但他们可能会添加其他内容。这些是我决定添加到类中的任何方法。
最重要的是,使用C中的类型,您可以定义数据的含义,即:一个字节,一个字,一个浮点数,一个char等。但是这些都暗示着什么操作是合法的,并且会产生可靠的结果。
类没有什么不同,只取决于您定义接口和可接受的操作。该类定义了这些东西,当您在对象中实例化它时,它定义了对象的行为,就像类型定义定义了对整数进行操作时的行为一样。
类只是使您能够灵活地定义新类型以及有关它们如何操作的所有信息。
定义好之后,每次我实例化“ thingy”类的对象时,它就会具有我定义的数据结构以及我说过可以使用的操作(方法)。“ thingy”类显然只是C ++允许我定义的一种新类型。
类型通常是指原始值的分类-整数,字符串,数组,布尔值,空值等。通常,您不能创建任何新类型。
类是指对象创建时与之关联的一组命名的属性和方法。尽管必须使用某些语言来创建一个新对象,然后将方法附加到该对象,但是通常可以定义任意数量的新类。
这个定义大体上是正确的,但是某些语言已经尝试以各种方式组合类型和类,并产生各种有益的结果。
如果我们在C#上下文中思考这个问题,我们将得到下面的答案。
C#类型系统分为以下几类:
值类型:
参考类型:
如您所见,C#中有许多类型,而Class仅是其中之一。有一个重要的注意事项:C#的类型系统是统一的,因此任何类型的值都可以视为对象。C#中的每个类型都直接或间接地源自对象类类型,而object是所有类型的最终基类。只需将值视为类型对象,即可将引用类型的值视为对象。通过执行装箱和拆箱操作,值类型的值被视为对象。
因此,正如我所见,类型是许多项目的保护伞,而类别是其中之一。
裁判:CSahrp语言规范文档,第4页