Type和Class有什么区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Type和Class有什么区别?相关的知识,希望对你有一定的参考价值。
什么使一个类型与类不同,反之亦然?
(在一般语言不可知的意义上)
摘自下面的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
我认为某种类型是你可以用特定价值做的事情。例如,如果您有一个整数值,则可以将其添加到其他整数(或执行其他算术运算),或将其传递给接受整数参数的函数。如果您有一个对象值,则可以在其上调用由其类定义的方法。
因为类定义了您可以对该类的对象执行的操作,所以类定义了一个类型。然而,类不止于此,因为它还提供了如何实现方法的描述(类型未暗示的内容)以及如何布置对象的字段。
另请注意,对象值只能有一个类,但它可能有多个类型,因为每个超类都提供了对象类中可用功能的子集。
因此,虽然对象和类型密切相关,但它们实际上并不是一回事。
类型通常是指原始值的分类 - 整数,字符串,数组,布尔值,null等。通常,您不能创建任何新类型。
类是指在创建对象时与其关联的命名属性和方法集。您通常可以根据需要定义任意数量的新类,尽管您需要创建一个新对象然后将方法附加到其中。
这个定义大多是正确的,但有些语言试图以各种方式组合类型和类,并带来各种有益的结果。
类型和类是相关的但不相同。我的看法是类用于实现继承,而类型用于运行时替换。
Here是一个解释替换原则的链接,以及为什么子类和子类型并不总是相同的东西(例如在Java中)。关于协方差和逆变的wikipedia页面有关于这种区别的更多信息。
有趣的问题。我认为aku的答案很明显。以java ArrayList
类为例
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
类的一个实例被称为它扩展的每个超类的类型以及它实现的每个接口。因此,ArrayList
类的一个实例有ArrayList
,RandomAccess
,Cloneable
等类型。换句话说,值(或实例)属于一种或多种类型,类定义这些类型是什么。
不同的类可以描述相同的类型。
类型包括以下部分:
- 操作=语法
- 操作描述=语义
类由以下部分组成:
- 操作=语法
- 实现(=各种实现描述相同的语义)
一些说明:
- 接口(如在Java中)不是类型,因为它不描述语义(仅描述语法)
- 子类不是子类型,因为子类可能会改变超类中定义的语义,子类型不能改变超类型语义(参见Liskov Substitution Principle,例如this LSP example)。
显然,由于类型系统的语言不是OO编程语言,因此类型必须是比类更广泛的概念
即使在像Java这样的语言中,int
也是(原始)类型,但不是类。
因此:每个类都是一个类型,但不是每个类都是类。
如果我们在C#语境中考虑这个问题,我们会得到以下答案。
C#类型系统分为以下几类:
价值类型:
- 简单类型:如int,long,float等。
- 枚举类型
- 结构类型
- 可空类型
参考类型:
- 班级类型
- 接口类型
- 数组类型
- 委托类型
正如您所看到的,C#中有许多类型,Class只是其中之一。只有一个重要的注意事项:C#的类型系统是统一的,任何类型的值都可以被视为一个对象。 C#中的每个类型都直接或间接地从对象类类型派生,而object是所有类型的最终基类。只需将值视为类型对象,即可将引用类型的值视为对象。通过执行装箱和拆箱操作将值类型的值视为对象。
所以我看到,类型是许多项目的保护伞,其中一类是其中之一。
参考:CSharp语言规范文档,第4页
一般而言语言无关 - Class是Type的实现。
通常,当这是该类型的唯一实现时,您可以使用这两个术语在某些上下文中引用它。
相反,例如,在C#上下文中 - 类只是类型概念的many more实现之一,如基元,结构,指针等。
这对我来说是一个很好的问题,这让我很难思考。我敢说Class是一个编译时的东西,Type是一个运行时的东西。我这样说是因为你写的类不是类型。然后,编译器从类创建类型,运行时使用类型来创建对象的实例。
我一直认为“类型”是“阶级”和“原始”的总称。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
C中的类型(如Int Float,char等)定义了可以对可以对其进行操作的特定方法执行操作的数据。它并不复杂。就像int我可以添加,减去乘法并且可以除。这些是我的int方法(或操作)。 Class只是新类型的定义。我首先定义数据的样子。也许它只是一点点。也许它是两个词,就像一个具有真实和想象部分的复合体。或许它的这个复杂的东西有309734325字节代表木星上一个怪异粒子的原子组成。我不在乎。就像一个整数,我可以用这种新数据类型来弥补我可以做的操作。在整数的情况下,我有加,减等。使用这种新的数据类型,我可以定义我认为有意义的任何操作。他们可能会添加减法等,但他们可能会添加其他东西。这些是我决定添加到我班级的任何方法。
底线是C中的类型,您可以定义数据是什么,即;一个字节,单词,浮点数,字符等。但是这些中的任何一个也意味着什么操作是合法的并且将产生可靠的结果。
除了由您定义接口和可接受的操作之外,类没有什么不同。该类定义了这些内容,当您在Object中实例化它时,它定义了对象的行为,就像类型定义定义操作它时的整数行为一样。
类只是让您可以灵活地定义新类型以及有关它们如何操作的所有内容。
一旦定义了这个,每次我实例化一个类“thingy”的对象时,它都有我定义的数据结构和我说你可以用它做的操作(方法)。 “thingy”类显然不过是C ++允许我定义的新类型。
灵感来自Wikipedia ......
在类型理论术语中;
- 类型是抽象接口。 类型通常代表名词,例如人,地点或事物,或名义化的东西,
- 类表示该类型的实现。
它是一个具体的数据结构和子程序集合
不同的具体类可以生成相同抽象类型的对象(取决于类型系统)。
*例如,可以实现类型
Stack
有两个类:SmallStack
(快速用于小堆栈,但是缩放比例很差)和ScalableStack
(规模很好,但是小堆栈的开销很高)。* 类似地,给定的类可能有几个不同的构造函数。
香蕉的例子。
Banana
类型一般代表香蕉的特性和功能。ABCBanana
和XYZBanana
课程将代表生产香蕉的方式。 (现实生活中不同的香蕉供应商,或在视频游戏中代表和绘制香蕉的不同数据结构和功能)。 然后ABCBanana
类可以产生特定的香蕉,它们是ABCBanana
类的实例,它们将是Banana类型的物体。
程序员为类型提供单一且唯一的实现并不罕见。在这种情况下,类名通常与类型名称相同。但是仍然存在一种类型(如果需要可以在接口中提取),以及构建类的实例(对象)的实现(将实现单独的接口)。
Type是所有可用对象模板或概念的总称。类是一个这样的对象模板。结构类型,整数类型,接口类型等也是如此。这些都是类型
如果你愿意,你可以这样看:类型是父概念。所有其他概念:类,接口,结构,整数等都继承自这个概念。它们是类型
类型包含数据的描述(即属性,操作等),
类是特定类型 - 它是用于创建objects实例的模板。
严格来说,类是一个特殊的概念,它可以被视为包含描述对象某些方面的metadata子集的包。
例如,在C#中,您可以找到接口和类。它们都是类型,但是接口只能定义一些契约,并且不能像类那样实例化。
简单来说,类是用于封装对象的属性和行为的专用类型。
维基百科可以为您提供更完整的答案:
以最快的方式说明它:
Struct是Type,但Struct不是Class。
如您所见,Type是一个“抽象”术语,不仅用于类的定义,还包括结构和原始数据类型,如float,int,bool。
类型在概念上是类的超集。从广义上讲,阶级是一种形式。
与类紧密相关的是接口,它可以被视为一种非常特殊的类 - 纯粹的抽象类。这些也是类型。
所以“type”也包含类,接口和大多数语言原语。像dot-net CLR这样的平台也有结构类型。
我的想法几乎与aku的答案一致。
我将类视为构建对象的模板,而类型是对这些对象进行分类的一种方式,并为我们提供了一个接口。
Python还添加了元类,它只是一种构建类的机制,与类构建对象的方式相同(而且,类和元类都是对象)。
This response对lamba中的同一个问题最终似乎是一个完美的解释。
添加另一个区别的例子:在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"
请注意,只涉及一个类,但可以使用几乎无限数量的类。在某些语言中,函数被认为是“第一类对象”,在这种情况下,函数的类型是一个类。在其他情况下,函数的类型仅仅是指针。类通常具有能够保存数据的概念,以及对该数据的操作。
以上是关于Type和Class有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章
<class 'str'> 和 <type 'str'> 有啥区别
解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段