什么使类型与类不同,反之亦然?
(在一般语言不可知的意义上)
答案 0 :(得分:107)
以下答案来自Gof书(设计模式)
对象的类定义了 对象实现。课程 定义对象的内部状态和 它的实施 操作
相比之下,一个物体 类型仅指其界面 - a 它可以的请求集 响应。
对象可以有多种类型, 和不同类的对象可以 具有相同的类型。
//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函数需要一个带有操作&gt; 的类型,其自身类型作为其中一个接口,满足上述要求的任何类都可用于为该类生成特定的最大函数。
答案 1 :(得分:51)
我总是把'类型'想象成'类'和'原语'的总称。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
答案 2 :(得分:37)
受Wikipedia启发......
类型理论条款;
类型是一个抽象界面 类型通常表示名词,例如人,地点或事物,或名义化的东西,
类表示该类型的实现 它是一个具体的数据结构和子程序集合
不同的具体类可以生成相同抽象类型的对象(取决于类型系统)。
*例如,可以使用两个类实现类型 Stack
:SmallStack
(对于小堆栈来说很快,但是扩展性很差)和ScalableStack
(对于小筹码来说很好但是开销很高)。*
同样,给定的类可能有几个不同的构造函数。
香蕉的例子。
Banana
类型一般代表香蕉的属性和功能。然后
ABCBanana
和XYZBanana
类将代表生产香蕉的方法。
(现实生活中不同的香蕉供应商,或在视频游戏中代表和绘制香蕉的不同数据结构和功能)。ABCBanana
类可以产生特定的香蕉ABCBanana
类的 实例 ,它们将是类型的 对象 Banana 。
程序员为类型提供单一且唯一的实现并不罕见。在这种情况下,类名称通常与类型名称相同。但是仍然存在一种类型(如果需要可以在接口中提取),以及构建类的实例(对象)的实现(将实现单独的接口)。
答案 3 :(得分:13)
Type是所有可用对象模板或概念的总称。类是一个这样的对象模板。结构类型,整数类型,接口类型等也是如此。这些都是类型
如果您愿意,可以这样看待:类型是父概念。所有其他概念:类,接口,结构,整数等都继承自这个概念。它们是类型
答案 4 :(得分:4)
类型包含数据的描述(即属性,操作等),
Class是一种特定类型 - 它是一个用于创建objects实例的模板。
严格来说,类是一个特殊的概念,它可以被视为包含描述对象某些方面的metadata子集的包。
例如在C#中,您可以找到接口和类。它们都是类型,但是接口只能定义一些契约,不能像类那样实例化。
简单地说 class 是一个专用类型,用于封装对象的属性和行为。
维基百科可以为您提供更完整的答案:
答案 5 :(得分:4)
以最快的方式说明:
Struct是一个Type,但Struct不是Class。
正如您所看到的,Type是一个“抽象”术语,不仅适用于类的定义,还适用于结构和原始数据类型,如float,int,bool。
答案 6 :(得分:3)
我的想法几乎与aku的答案一致。
我将类视为构建对象的模板,而类型是对这些对象进行分类的一种方式,并为我们提供了一个接口。
Python还添加了元类,它只是一种构建类的机制,与类构建对象的方式相同(而且,类和元类都是对象)。
This response对于lamba中的同一个问题,终极在我看来就像一个完美的解释。
答案 7 :(得分:3)
Type在概念上是类的超集。从广义上讲,一个类是一种类型。
与类紧密相关的是接口,可以看作是一种非常特殊的类 - 纯粹的抽象类。这些也是类型。
所以“type”也包含类,接口和大多数语言原语。像dot-net CLR这样的平台也有结构类型。
答案 8 :(得分:2)
取自下面的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
且< / strong> IType
满足:
对象可以有多种类型, 和不同类的对象可以 具有相同的类型。
子类型和子类之间的区别可能也有助于理解该问题:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
答案 9 :(得分:2)
添加另一个区别的例子:在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"
请注意,只涉及一个类,但可以使用几乎无限数量的类。在某些语言中,函数被认为是“第一类对象”,在这种情况下,函数的类型是一个类。在其他情况下,函数的类型仅仅是指针。类通常具有能够保存数据的概念,以及对该数据的操作。
答案 10 :(得分:1)
类型和类是相关的但不相同。我的看法是类用于实现继承,而类型用于运行时替换。
Here是解释替换原则的链接,以及为什么子类和子类型并不总是相同的(例如在Java中)。关于协方差和逆变的wikipedia页面提供了有关这种区别的更多信息。
答案 11 :(得分:1)
在像 Haskell 这样的语言中,不存在 Class 的概念。它只有类型。 (还有 Type Class。不要与 Class 混淆,Type Class 更像是 Type 的抽象版本。
Monad 是一个类型类。
class Monad m where
(>>=) :: m a -> ( a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
从(纯)函数式编程的角度来看,Type 比 Class 更基础,因为可以将其根源追溯到 Type Theory(例如,从 PTL 的角度来看,有类型和没有类型的 lambda 演算的行为完全不同),而类实际上只是一种实现面向对象的构造。
在只支持 Type 不支持 Class 的语言中,函数通常被视为一等公民。
同时,当一种语言区分类型和类时,函数更像是可以附加到对象等的二等公民。是的,通常您可以将函数附加到类本身(也称为类)静态函数)。
答案 12 :(得分:1)
类型通常是指原始值的分类 - 整数,字符串,数组,布尔值,null等。通常,您不能创建任何新类型。
类是指对象在创建时与之关联的命名属性和方法集。您通常可以根据需要定义任意数量的新类,尽管某些语言必须创建新对象然后将方法附加到其中。
这个定义大多是正确的,但有些语言试图以各种方式组合类型和类,并带来各种有益的结果。
答案 13 :(得分:1)
我认为某种类型是您可以使用特定值执行的一组操作。例如,如果您有一个整数值,则可以将其添加到其他整数(或执行其他算术运算),或将其传递给接受整数参数的函数。如果您有一个对象值,则可以在其上调用由其类定义的方法。
因为类定义了您可以对该类的对象执行的操作,所以类定义了一个类型。然而,一个类不止于此,因为它还提供了如何实现方法的描述(类型不暗示的内容)以及如何布置对象的字段。
另请注意,对象值只能有一个类,但它可能有多个类型,因为每个超类都提供了对象类中可用功能的子集。
因此尽管对象和类型密切相关,但它们实际上并不是一回事。
答案 14 :(得分:0)
C中的类型(如Int Float,char等)定义了可以用可对它们进行操作的特定方法对其进行操作的数据。没有比这更复杂的了。像int一样,我可以加,减,乘,除。这些是我用于int的方法(或操作)。类只是对新类型的定义。我首先定义数据的外观。也许只是一点点。也许这是两个单词,就像一个具有真实和虚构部分的复合体。也许它的复杂之处在于309734325字节,代表木星上一个奇怪粒子的原子组成。我不在乎就像整数一样,我可以弥补使用这种新数据类型可以执行的操作。对于整数,我要进行加,减等操作。使用这种新的数据类型,我可以定义我认为有意义的任何操作。它们可能是加减法等,但可能会添加其他东西。这些是我决定添加到类中的任何方法。
最重要的是,对于C中的类型,您可以定义数据的含义,即:一个字节,一个字,一个浮点数,一个字符等。但是这些都暗示着什么操作是合法的,并且会产生可靠的结果。
一个类没有什么不同,只取决于您定义接口和可接受的操作。该类定义了这些东西,当您在对象中实例化它时,它定义了对象的行为,就像类型定义定义了对整数进行操作时的行为一样。
类只是使您能够灵活地定义新类型以及有关它们如何运行的所有信息。
一旦定义了这个对象,每次实例化“ thingy”类的对象时,它就会具有我定义的数据结构以及我说过可以使用的数据操作(方法)。显然,“ thingy”类只是C ++允许我定义的一种新类型。
答案 15 :(得分:0)
这对我来说是个好问题,这使我很难思考。我敢说类是编译时,而类型是运行时。我说这是因为您编写的是类而不是类型。然后,编译器根据类创建类型,然后运行时使用类型来创建对象的实例。
答案 16 :(得分:0)
不同的类可能描述相同的类型。
类型由以下部分组成:
类由以下部分组成:
一些注意事项:
接口(如在Java中)不是类型,因为它不描述语义(仅描述语法)
子类不是子类型,因为子类可能会更改超类中定义的语义,子类型不能更改超类型语义(请参阅Liskov替换原则,例如this LSP example)。
答案 17 :(得分:0)
在与一般语言无关的意义上-类是类型的实现。
通常这是该类型的 only 实现,您可以在某些情况下使用这两个术语来引用它。
相反,例如,在C#上下文中- Class 只是<<>的many more 实现的一个 strong> Type 概念,例如基元,结构,指针等。
答案 18 :(得分:0)
如果我们在C#语境中考虑这个问题,我们会得到以下答案。
C#类型系统分为以下几类:
价值类型:
参考类型:
正如您所看到的,C#中有许多类型,其中Class只是其中之一。 只有一个重要的注意事项: C#的类型系统是统一的,任何类型的值都可以被视为一个对象。 C#中的每个类型都直接或间接地从对象类类型派生,而object是所有类型的最终基类。只需将值视为类型对象,即可将引用类型的值视为对象。通过执行装箱和拆箱操作,值类型的值被视为对象。
因此,我看到,类型是许多项目的保护伞,其中一类是其中之一。
Referece:CSahrp Language Specification doc,page 4
答案 19 :(得分:0)
显然,由于类型系统的语言不是OO编程语言, type 必须是比 class 更广泛的概念
即使在像Java这样的语言中,int
也是(原始)类型,但不是类。
因此:每个类都是一个类型,但不是每个类都是一个类。
答案 20 :(得分:0)
有趣的问题。我认为aku的答案很明显。以java ArrayList
类为例
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList
类的实例被称为它扩展的每个超类的类型以及它实现的每个接口。因此,ArrayList
类的实例具有类型ArrayList
,RandomAccess
,Cloneable
等。换句话说,值(或实例)属于一个或多个类型,类定义这些类型是什么。
答案 21 :(得分:-1)
类型是编程结构,可帮助编译器执行类型检查并确保变量具有用于操作的正确属性。
类是用户定义的类型,引用它们的对象或变量可能具有这些类型。这些也需要进行类型检查。