Type和Class有什么区别?
是什么使得一个类与class不同,反之亦然?
(在一般的语言不可知的意义上)
下面的答案是来自Gof的书(Design Patterns)
对象的类定义了对象是如何实现的。类定义了对象的内部状态和操作的实现。
相比之下,对象的types只是指其接口 – 它可以响应的一组请求。
一个对象可以有多个types,不同类的对象可以有相同的types。
//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 comparision }
max函数需要一个types与操作>与自己的types作为其中之一界面任何满足上述要求的类可以用于生成该类的特定的最大function。
我一直认为“types”是“阶级”和“原始”的总称。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
灵感来自维基百科 …
在types理论方面;
-
一个types是一个抽象接口。
types通常代表名词,如人物,地点或事物,或者名词化的东西, -
类表示types的实现。
它是一个具体的数据结构和子程序的集合不同的具体类可以产生相同抽象types的对象(取决于types系统)。
*例如,可以使用两个类实现
Stack
types :SmallStack
(对于小堆栈很快,但尺度不好)和ScalableStack
(对于小堆栈,可以很好地ScalableStack
但开销很高)*同样,给定的类可能有几个不同的构造函数 。
香蕉的例子。
Banana
types一般代表Banana
的特性和function。
ABCBanana
和XYZBanana
类将代表生产香蕉的方法。
(在现实生活中不同的香蕉供应商,或在video游戏中performance和绘制香蕉的不同数据结构和function)。然后,
ABCBanana
类可以生成特定的香蕉,它们是ABCBanana
类的 实例 ,它们将是香蕉types的 对象 。
程序员提供一个types的唯一实现并不罕见。 在这种情况下, 类名通常与types名相同。 但是仍然有一个types(如果需要,可以在接口中提取)以及构build类的实例(对象)的实现(将实现单独的接口)。
types是所有可用对象模板或概念的总称。 一个类是一个这样的对象模板。 结构types,整数types,接口types等也是如此
如果你愿意,你可以这样看:一个types是父类的概念。 所有其他的概念:类,接口,结构,整数等inheritance这个概念。它们是types
types包含数据的描述(即属性,操作等),
类是一个特定types – 它是创build对象实例的模板。
严格地说,类是一个特殊的概念,它可以被看作是一个包含描述对象某些方面的元数据子集的包。
例如在C#中可以find接口和类。 它们都是types,但接口只能定义一些合约,不能像类一样实例化。
简而言之, 类是一种专用types,用于封装对象的属性和行为。
维基百科可以给你一个更完整的答案:
- 类的定义
- 数据types的定义
为了说明这个最快的方法:
一个Struct是一个types,但是一个Struct不是一个类。
正如你所看到的,Type不仅是一个“抽象”的术语,不仅仅是类的定义,还有像float,int,bool这样的结构和原始数据types。
types在概念上是类的超集。 广义而言,一个类是一种types。
与类密切相关的是接口,它可以被看作是一个非常特殊的类 – 一个纯粹抽象的类。 这些也是types。
所以“types”包含类,接口和大多数语言原语。 像networkingCLR这样的平台也具有结构types。
我的想法与阿库的答案非常吻合。
我将类看作构build对象的模板,而types则是对这些对象进行分类的一种方式,并为我们提供了一个接口。
Python也增加了元类,它们只是构build类的一种机制,就像类构build对象(以及类和元类都是对象)一样。
对兰博这个同样的问题的回应在我看来似乎是一个完美的解释。
我认为一种types就是你可以用一个特定的价值来做的事情。 例如,如果你有一个整数值,你可以将它添加到其他整数(或执行其他算术运算),或将其传递给接受整数参数的函数。 如果你有一个对象的值,你可以调用它的类定义的方法。
因为一个类定义了你可以用这个类的对象做什么,所以一个类定义了一个types。 一个类不止于此,因为它也提供了如何实现这些方法的描述(types中没有暗示的东西)以及对象的字段是如何布置的。
还要注意,一个对象值只能有一个类,但它可能有多个types,因为每个超类都提供了对象类中可用function的一个子集。
所以虽然物体和types是密切相关的,但它们实际上并不是一回事。
types通常是指原始值的分类 – 整数,string,数组,布尔值,空值等。通常,您不能创build任何新的types。
类是指对象在创build时与其关联的一组指定的属性和方法。 通常可以根据需要定义许多新类,但是有些语言需要创build一个新对象,然后将方法附加到该对象上。
这个定义大部分是正确的,但有些语言试图以各种方式将types和类组合起来,并带来各种有益的结果。
要添加另一个区别的例子:在C ++中,您可以使用可以引用类的指针和引用types,但不是本身的类。
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"
请注意,只涉及一个类,但可以使用几乎无限的types。 在某些语言中,函数被认为是“第一类对象”,在这种情况下,函数的types是类。 在另一些情况下,函数的types仅仅是一个指针。 类通常具有能够保存数据的概念以及对数据的操作。
types和类是相关的,但不完全相同。 我的意思是类用于实现inheritance,而types用于运行时replace。
这是一个链接,解释替代原则,以及为什么子类和子types不总是相同的东西(例如在Java中)。 关于协变和逆变的维基百科页面有更多这方面的信息。
从以下GoF引用中引用:
一个对象的类定义了对象是如何实现的。这个类定义了对象的内部状态和操作的实现。
相比之下,对象的types只是指其接口 – 它可以响应的一组请求。
我想提供一个使用Java的例子:
public interface IType { } public class A implements IType { public A{}; } public class B implements IType { public B{}; }
A
类和B
类都实现了接口,因此是typesIType
。 另外在Java中,这两个类都产生它们自己的types(分别是它们的类名)。 因此, A
类是A
类和 IType
类, B
类是B
类和 IType
类,满足:
一个对象可以有多种types,不同类的对象可以有相同的types。
子types和子类别之间的区别可能有助于理解这个问题:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
有趣的问题。 我认为aku的答案是现货。 以java ArrayList
类为例
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
一个ArrayList
类的实例被认为是它所扩展的每个超类的types以及它实现的每个接口。 因此, ArrayList
类的一个实例有一个typesArrayList
, RandomAccess
, Cloneable
等等。 换句话说,值(或实例)属于一个或多个types,类定义了这些types是什么。
不同的类可能会描述相同的types。
types由以下部分组成:
- 操作=语法
- 操作描述=语义
类由这些部分组成:
- 操作=语法
- 实现(=各种实现描述相同的语义)
一些说明:
-
接口(如在Java中)不是types的,因为它不描述语义(只描述语法)
-
子类不是子types,因为子类可能会改变在超类中定义的语义,子types不能改变超types语义(参见Liskov替代原理,例如这个LSP例子 )。
很显然,由于有types系统的语言不是OO编程语言, types必须比类更广泛
即使在像Java这样的语言中, int
也是(原始)types,但不是类。
因此:每个class级都是一个class级,但不是每一个class级都是class级。
如果我们在C#语境下思考这个问题,我们可以得出以下答案。
C#types系统分为以下几类:
值types:
- 简单types:像int,long,float等
- 枚举types
- 结构types
- 可空types
参考types:
- 类types
- 接口types
- 数组types
- 代表types
正如你所看到的那样,C#中有很多类,其中Class只是其中之一。 只有一个重要的注意事项:C#的types系统是统一的,任何types的值都可以被当作一个对象。 C#中的每个types都直接或间接地从对象类types派生,对象是所有types的最终基类。 引用types的值只需将值作为types对象查看即可视为对象。 值types的值通过执行装箱和拆箱操作被视为对象。
所以我看到,types是许多项目的保护伞,哪一类是其中之一。
参考:CSahrp语言规范文档,第4页