language agnostic - times - ¿Cuál es la diferencia entre Type y Class?
subfiles latex (17)
¿Qué hace que un tipo sea diferente de la clase y viceversa?
(En el sentido general del lenguaje-agnóstico)
El tipo contiene una descripción de los datos (es decir, propiedades, operaciones, etc.),
La clase es un tipo específico: es una plantilla para crear instancias de objects .
Estrictamente hablando, la clase es un concepto especial, se puede ver como un paquete que contiene un subconjunto de metadata describen algunos aspectos de un objeto.
Por ejemplo, en C # puedes encontrar interfaces y clases. Ambos son tipos, pero la interfaz solo puede definir algún contrato y no se puede instanciar a diferencia de las clases.
Simplemente hablando clase es un tipo especializado utilizado para encapsular las propiedades y el comportamiento de un objeto.
Wikipedia puede darle una respuesta más completa:
Inspirado por Wikipedia ...
En términos de teoría de tipos ;
Un tipo es una interfaz abstracta.
Los tipos generalmente representan sustantivos, como una persona, lugar o cosa, o algo nominalizado,Una clase representa una implementación del tipo.
Es una estructura de datos concreta y una colección de subrutinasDiferentes clases concretas pueden producir objetos del mismo tipo abstracto (dependiendo del sistema de tipo).
* Por ejemplo, uno podría implementar el tipo
Stack
con dos clases :SmallStack
(rápido para pilas pequeñas, pero escalas escasamente) yScalableStack
(escalas bien pero alta sobrecarga para pilas pequeñas). *Del mismo modo, una clase determinada puede tener varios constructores diferentes.
El ejemplo de banana
Un tipo de
Banana
representaría las propiedades y la funcionalidad de los plátanos en general.Las clases
ABCBanana
yXYZBanana
representarían formas de producir plátanos.
(Diferentes proveedores de banano en la vida real, o diferentes estructuras de datos y funciones para representar y dibujar plátanos en un videojuego).La clase
ABCBanana
podría producir bananas particulares que son instancias de la claseABCBanana
, serían objetos del tipo Plátano .
No es raro que el programador proporcione una implementación única y única para un tipo. En este caso, el nombre de la clase a menudo es idéntico al nombre del tipo . Pero todavía hay un tipo (que podría extraerse en una interfaz si es necesario) y una implementación (que implementaría la interfaz separada) que crea instancias (objetos) de la clase.
Interesante pregunta. Creo que la respuesta de aku es perfecta. Tome la clase java ArrayList
como ejemplo
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Se dice que una instancia de la clase ArrayList
es del tipo de cada superclase que se extiende y de cada interfaz que implementa. Por lo tanto, una instancia de la clase ArrayList
tiene un tipo ArrayList
, RandomAccess
, Cloneable
, y así sucesivamente. En otras palabras, los valores (o instancias) pertenecen a uno o más tipos, las clases definen cuáles son estos tipos.
La siguiente respuesta es del libro de Gof (Patrones de diseño)
La clase de un objeto define cómo se implementa el objeto. La clase define el estado interno del objeto y la implementación de sus operaciones.
Por el contrario, el tipo de un objeto solo se refiere a su interfaz, un conjunto de solicitudes a las que puede responder.
Un objeto puede tener muchos tipos, y los objetos de diferentes clases pueden tener el mismo tipo.
//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
}
la función máxima requiere un tipo con operación> con su propio tipo ya que una de las interfaces de cualquier clase que satisfaga el requisito anterior se puede usar para generar una función máxima específica para esa clase.
Los tipos y las clases están relacionados, pero no son idénticos. Mi opinión es que las clases se utilizan para la herencia de implementación, mientras que los tipos se utilizan para la sustitución en tiempo de ejecución.
Here hay un enlace que explica el principio de sustitución y por qué las subclases y subtipos no son siempre lo mismo (en Java, por ejemplo). La página de wikipedia sobre covarianza y contravarianza tiene más información sobre esta distinción.
Mis pensamientos están más o menos en línea con la respuesta de aku.
Veo las clases como una plantilla para construir objetos, mientras que los tipos son una forma de clasificar esos objetos, y nos proporcionan una interfaz para ellos.
Python también agrega metaclases, que son solo un mecanismo para crear clases, de la misma forma que las clases crean objetos (y bueno, las clases y las metaclases son ambos objetos).
Esta respuesta a la misma pregunta en lamba the ultimate me parece una explicación perfecta.
Obviamente, como hay lenguajes con un sistema de tipos que no son lenguajes de programación OO, el tipo debe ser un concepto más amplio que la clase
Incluso en idiomas como Java, int
es un tipo (primitivo), pero no una clase.
Por lo tanto: cada clase es un tipo, pero no todos los tipos son una clase.
Para agregar otro ejemplo de distinción: en C ++ tiene punteros y tipos de referencia que pueden referirse a clases, pero no son clases en sí mismas.
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"
Tenga en cuenta que solo una clase está involucrada, pero se puede usar un número casi infinito de tipos. En algunos idiomas, las funciones se consideran "objetos de primera clase", en cuyo caso, el tipo de una función es una clase. En otros, el tipo de función es simplemente un puntero. Las clases generalmente tienen los conceptos de poder contener datos, así como las operaciones sobre esos datos.
Para ilustrarlo de la manera más rápida:
Una estructura es un tipo, pero una estructura no es una clase.
Como puede ver, un Tipo es un término "abstracto" no solo para definiciones de clases, sino también para estructuras y tipos de datos primitivos como float, int, bool.
Pienso en un tipo como el conjunto de cosas que puedes hacer con un valor particular. Por ejemplo, si tiene un valor entero, puede agregarlo a otros enteros (o realizar otras operaciones aritméticas) o pasarlo a funciones que acepten un argumento entero. Si tiene un valor de objeto, puede llamar a los métodos que están definidos por su clase.
Debido a que una clase define lo que puede hacer con los objetos de esa clase, una clase define un tipo. Sin embargo, una clase es más que eso, ya que también proporciona una descripción de cómo se implementan los métodos (algo que no está implícito en el tipo) y cómo se presentan los campos del objeto.
Tenga en cuenta también que un valor de objeto solo puede tener una clase, pero puede tener varios tipos, ya que cada superclase proporciona un subconjunto de la funcionalidad disponible en la clase del objeto.
Entonces, aunque los objetos y los tipos están estrechamente relacionados, en realidad no son la misma cosa.
Si pensamos en esta pregunta en el contexto de C #, llegamos a la siguiente respuesta.
El sistema de tipo C # se divide en las siguientes categorías:
Tipos de valor:
- Tipos simples: como int, long, float, etc.
- Tipos de Enum
- Tipos de estructura
- Tipos anulables
Tipos de referencia:
- Tipos de clase
- Tipos de interfaz
- Tipos de matriz
- Tipos de delegados
Como puede ver, hay muchos tipos en C #, que Class es solo uno de ellos. Solo hay una nota importante: el sistema de tipos de C # está unificado de manera que un valor de cualquier tipo se puede tratar como un objeto. Cada tipo en C # deriva directa o indirectamente del tipo de clase de objeto, y object es la última clase base de todos los tipos. Los valores de los tipos de referencia se tratan como objetos simplemente al ver los valores como tipo de objeto. Los valores de los tipos de valores se tratan como objetos realizando operaciones de boxeo y desembalaje.
así que, como veo, el tipo es un paraguas sobre muchos elementos cuya clase es uno de ellos.
Referece: CSahrp Language Specification doc, página 4
Siempre pienso en un ''tipo'' como un término general para ''clases'' y ''primitivos''.
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
Tipo es conceptualmente un superconjunto de clase. En un sentido más amplio, una clase es una forma de tipo.
Estrechamente relacionado con las clases hay interfaces, que pueden verse como un tipo de clase muy especial, una puramente abstracta. Estos también son tipos.
Entonces "tipo" abarca clases, interfaces y en la mayoría de las primitivas idiomas también. También plataformas como la CLR dot-net también tienen tipos de estructura.
Tipo es el término general para todas las plantillas de objetos o conceptos disponibles. Una clase es una de esas plantillas de objetos. También lo es el tipo de estructura, el tipo de Entero, el tipo de Interfaz, etc. Estos son todos los tipos
Si lo desea, puede verlo de esta manera: un tipo es el concepto principal. Todos los demás conceptos: Clase, Interfaz, Estructura, Entero, etc. heredan de este concepto. Son tipos
Tomado de la cita de GoF de abajo:
Una clase de objetos define cómo se implementa el objeto. La clase define el estado interno del objeto y la implementación de sus operaciones.
Por el contrario, el tipo de un objeto solo se refiere a su interfaz, el conjunto de solicitudes a las que puede responder.
Quiero dar un ejemplo usando Java:
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
Ambas clases A
y B
implementan la interfaz y, por lo tanto, son del tipo IType
. Además en Java, ambas clases producen su propio tipo (respectivamente a su nombre de clase). Por lo tanto, la clase A
es de tipo A
y IType
y la clase B
es de tipo B
y IType
satisface:
Un objeto puede tener muchos tipos, y los objetos de diferentes clases pueden tener el mismo tipo.
La diferencia entre los subtipos y la subclase probablemente también ayude a comprender ese problema:
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
Diferentes clases pueden describir el mismo tipo.
El tipo consta de estas partes:
- Operaciones = sintaxis
- Descripción de operaciones = semántica
La clase consta de estas partes:
- Operaciones = sintaxis
- Implementación (= varias implementaciones describen la misma semántica)
Algunas notas:
La interfaz (como en Java) no es de tipo, porque no describe la semántica (solo describe la sintaxis)
La subclase no es un subtipo, porque la subclase puede cambiar la semántica definida en la superclase, el subtipo no puede cambiar la semántica de supertipo (consulte el Principio de sustitución de Liskov, por ejemplo, este ejemplo de LSP ).
Tipo generalmente se refiere a la clasificación de valores primitivos: enteros, cadenas, matrices, booleanos, nulos, etc. Por lo general, no puede crear ningún tipo nuevo.
La clase se refiere al conjunto de propiedades y métodos con los que se asocia un objeto cuando se crea. Por lo general, puede definir tantas clases nuevas como desee, aunque en algunos idiomas debe crear un nuevo objeto y luego adjuntarle métodos.
Esta definición es mayormente cierta, pero algunos lenguajes han intentado combinar tipos y clases de varias maneras, con varios resultados beneficiosos.