类型和类别有什么区别?
-
19-08-2019 - |
题
是什么使类型不同于类,反之亦然?
(在与语言无关的一般意义上)
解决方案
以下的答案是从GOF书(设计模式的)
的对象的类强>定义如何 对象被实现.The类 定义对象的内部状态和 的执行情况 操作
在另一方面,一个对象的 的类型强>仅是指它的接口 - 一个 设置的请求到它可以 响应。
对象可以有多种类型, 和不同类的对象可以 有相同的类型。
//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函数需要具有的操作的类型> 强>使用其自己的类型作为它的一个接口满足可用于产生用于该类特定max函数上述要求的任何类。
其他提示
我一直认为一个“类型”为“类”和“基元”的总称的。
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
灵感 维基百科...
在 类型理论 条款;
一个 类型 是一个抽象的界面。
类型一般代表的名词,例如个人、地点或事物,或者东西nominalized,一个 类 代表一个执行情况的类型。
它是一个具体的数据结构和收集的子程序不同的具体类可能产生的对象相同的抽象的类型(根据不同类型系统)。
*例如,一个可能会实现的 类型
Stack
有两个 类:SmallStack
(快速的小堆,但尺度不当)和ScalableStack
(尺度,但高的开销用于小堆).*同样,某一特定课程可以有几种不同 构造.
香蕉的例子。
一个
Banana
类型 会代表的性质和功能的香蕉。的
ABCBanana
和XYZBanana
类 会代表的方式生产的香蕉。
(不同的香蕉供应商在现实生活中,或不同的数据结构和功能来表示和绘制香蕉中的一个视频游戏)。的
ABCBanana
类,然后可能会产生特殊的香蕉是 实例 的ABCBanana
类, 他们将被 对象 的 类型 香蕉.
它不是罕见的程序员提供一个单和只有实现一种类型。在这种情况下 类 名字往往是相同的 类型的名字.但仍有类型(其中可以提取出一个界面,如果需要的),和一个执行情况(它将实施单独的接口)建立实例(目的)分类。
类型是所有可用的对象模板或概念的涵盖性术语。类是一个这样的对象模板。因此是结构类型,整数类型,接口类型等,这些是所有类型的
如果你愿意,你可以看看它是这样的:A型是父概念。所有的其它概念:类,接口,结构,整数等从该concept.i.e继承它们是类型
要说明它的最快方式:
一个结构是A型,但一个结构不是一类。
可以看到,类型为类不仅定义的“抽象”术语,而且结构和原语数据类型,例如浮动,整型,布尔。
类型是概念性类的超集。在更广泛的意义上说,一个类的类型的一种形式。
密切相关类的接口,其可以蜜蜂看作是非常特殊的类 - 一个纯粹抽象之一。这些也都是类型。
因此,“类型”包含类,接口和在大多数语言原语太。也像点净CLR平台具有结构类型太
我的想法是一致几乎与阿克苏的答案。点击
我看到班级为建设对象的模板,而类型对这些对象进行分类的方式,并为我们提供他们的接口。点击
的Python还添加了元类,即只是建立类的机构,以相同的方式如类构建对象(和井,类和元类都是对象)。
这以在兰巴同样的问题的响应的最终似乎我像一个完美的解释。
这GoF的引文取自以下:
这是对象的类强>定义如何 对象被实现.The类 定义对象的内部状态和 的执行情况 操作
在相反,对象的 的类型强>仅是指它的接口-the 设置的请求到它可以 响应。
我想使用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 /课程/存档/ fall98 / cs441 / mainus / node12.html
要添加区分的另一个例子:在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的答案是当场上。取的java ArrayList
类为例
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
的 ArrayList
类的实例被认为是类型每次延伸超类和每一个它实现接口的。因此,ArrayList
类的一个实例具有类型ArrayList
,RandomAccess
,Cloneable
,等等。换言之,值(或实例)属于一个或多个类型,类定义什么这些类型。
不同类可以描述的相同类型。
类型包括的这些部分:
- 业务=语法
- 说明行动=义
类包括这些部分:
- 业务=语法
- 执行情况(=各种实现方式描述了同样的语)
一些注意事项:
接口(如在Java)不是类型,因为它不描述语义(仅描述了语法)
类不型,因为类可能变化的语义定义在超类型无法改变的超类型的语义(见里氏替换原则,例如 这LSP例).
显然,作为存在与类型系统中不面向对象编程语言的语言,型必须是比更广泛的概念的类
即使是在像Java这样的语言,int
为(原始)型,但不是类。
因此:每一个类是一种类型的,但不是每一种类型是一个类
。如果我们认为这个问题在C#方面,我们达到以下答复。
C#类型的系统分为以下类别:
值的类型:
- 简单的类型:像int,长,漂浮,等等。
- 枚举的类型
- 结构类型
- 空类型
参照类型:
- 类型
- 接口的类型
- 阵列类型
- 委托类型
正如你可以看到有许多类型在C#这类仅仅是他们中的一个。只有一个重要注意:C#'s型系统是统一的,这样的一个值的任何类型可以是处理作为对象。每一种类型在C#直接或间接源自对象类型,并对象是最终的基类的所有类型。值的基准类型是处理为对象仅仅通过观看的价值观作为类型的对象。值价值的类型被视为目的通过进行拳击和拆箱操作。
因此,正如我看到的,型是一个伞式通过多项这类是他们中的一个。
Referece:CSahrp语言规范文件,第4页
在 一般语言不可知论 感觉 - 班级 是一个 实现 的 类型.
通常当这是 仅有的 该类型的实现,您可以在某些上下文中使用这两个术语来引用它。
相反,例如,在 C# 上下文中 - 班级 只是 一 的 还有很多 实施 的一个 类型 基本概念、结构体、指针等。
这是一个很好的问题,对我来说,这让我觉得很难。我敢说那类是一个编译时啄和类型是运行时啄。我这样说是因为你写的类不是类型。然后,编译器创建从类类型,和运行时使用的类型来创建对象的实例。
类型C样Int浮炭等定义的数据,可以采取行动的具体方法,可以对它们。它没有比这更复杂。像int我可以加减乘以及可能的鸿沟。这些都是我的方法(或业务),用于int。一类是一个简单的定义的一种新类型。我首先确定什么该数据看起来像。也许它的一个单位。也许这是两个词就像一个复杂的现实和虚构的一部分。或者,也许其这个复杂的东西与309734325字节表示的原子的化妆的一个奇怪的粒子上的木星。我不在乎。就像一个整数,我可以弥补操作我可以用这个新的数据类型。在这种情况下的整我不得不增加、减,等等。这个新的数据类型我可以定义的任何行动,我认为有意义的。他们可能会增加减等等。但他们可以添加其他的东西。这些都是什么方法我决定加入到我的阶级。
底线是,与一个类型中的C,你有一个定义的数据,即;一个字单词,float,char等。但是,任何这还意味着什么样的行动是合法的,将产生可靠的结果。
一类是没有不同,除非它是由你来定义的界面和可接受的操作。这类定义了这些东西当你的实例这一目的的定义的行为的对象就像一个类型的定义定义的行为的一个整数,当你对其进行操作。
课程只是给你的灵活性来定义的新的类型和一切有关它们如何操作。
一旦这个定义是,每次我的实例类的对象"东西",它有数据结构定义和操作(方法),我说你可以做用它。类的"东西"显然是没什么更多或少于一个新的类型,C++让我定义。