¿Cuál es la diferencia entre Type y Class?

Respuestas:

121

La siguiente respuesta es del libro 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 comparison
}

La función max requiere un tipo con operation> con su propio tipo como una de sus interfaces, cualquier clase que cumpla con el requisito anterior se puede usar para generar una función max específica para esa clase.

yesraaj
fuente
56

Siempre pienso en un "tipo" como un término general para "clases" y "primitivas".

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass

Eddie Parker
fuente
77
explicación agradable y concisa :)
aku
3
Bueno, en .NET debería ser lo mismo, incluso las primitivas son clases (o más exactamente estructuras).
dalle
44
@dalle: de acuerdo, no hay diferencia inherente entre tipo y clase. El ejemplo de Eddie depende mucho de C ++ / Java. No es en absoluto LA definición.
Robert Gould
Me imagino que será difícil obtener "LA" definición de "tipo" versus una clase. Muchos idiomas tienen su propio sistema de escritura. Una definición que escuché para .NET fue que un 'tipo' incluye ambos tipos de referencia y valor, mientras que una clase solo se usa para describir tipos de referencia.
Eddie Parker el
2
¿No es int solo una abreviatura de System.Int32? En otras palabras: int foo; // El tipo es int, la clase es System.Int32?
Svish 05 de
51

Inspirado en 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 subrutinas.

    Diferentes clases concretas pueden producir objetos del mismo tipo abstracto (dependiendo del sistema de tipos).

    * Por ejemplo, uno podría implementar el tipo Stack con dos clases : SmallStack(rápido para pilas pequeñas, pero escalas mal) y ScalableStack(escala bien pero sobrecarga elevada para pilas pequeñas). *

    Del mismo modo, una clase dada puede tener varios constructores diferentes .

ingrese la descripción de la imagen aquí

El ejemplo del plátano.

  • Un Banana tipo representaría las propiedades y la funcionalidad de los plátanos en general.

  • Las clasesABCBanana y representarían formas de producir plátanos. (Diferentes proveedores de bananas en la vida real, o diferentes estructuras de datos y funciones para representar y dibujar bananas en un videojuego).XYZBanana

    La ABCBananaclase podría producir plátanos particulares que son instancias de la ABCBanana clase , 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 suele ser idéntico al nombre del tipo . Pero todavía hay un tipo (que podría extraerse en una interfaz si fuera necesario) y una implementación (que implementaría la interfaz separada) que crea instancias (objetos) de la clase.

minutos
fuente
3
Como alguien que lucha por aprender a menos que se le dé un ejemplo del mundo real, esto realmente me ayudó mucho. Gracias.
alexc95
13

Tipo es el término general para todas las plantillas o conceptos de objetos disponibles. Una clase es una de esas plantillas de objeto. También lo es el tipo de estructura, el tipo entero, el tipo de interfaz, etc. Estos son todos los tipos

Si lo desea, puede verlo de esta manera: un tipo es el concepto padre. Todos los demás conceptos: clase, interfaz, estructura, número entero, etc., se heredan de este concepto. Son tipos

Lonzo
fuente
4

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 objetos .

Estrictamente hablando, la clase es un concepto especial, puede verse como un paquete que contiene un subconjunto de metadatos que describen algunos aspectos de un objeto.

Por ejemplo, en C # puede encontrar interfaces y clases. Ambos son tipos, pero la interfaz solo puede definir algunos contratos y no se puede instanciar a diferencia de las clases.

Simplemente hablando, la clase es un tipo especializado que se utiliza para encapsular las propiedades y el comportamiento de un objeto.

Wikipedia puede darte una respuesta más completa:

aku
fuente
4

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" para no solo definiciones de clases, sino también estructuras y tipos de datos primitivos como float, int, bool.

icelava
fuente
2
Estaría bien mencionar el .net CLR como ejemplo de un marco en el que existen tipos que no son clases (Java podría citarse como otro, aunque .net tiene más tipos de tipos). Sin embargo, una pequeña arruga adicional en .net es que Type(en mayúscula como se muestra) es el nombre corto de una clase de sistema ( System.Type) que se utiliza para contener descripciones de tipos.
supercat
3

El tipo es conceptualmente un superconjunto de clase. En el sentido más amplio, una clase es una forma de tipo.

Las interfaces están estrechamente relacionadas con las clases, que pueden verse como un tipo de clase muy especial, puramente abstracto. Estos también son tipos.

Entonces "tipo" abarca clases, interfaces y en la mayoría de los idiomas primitivos también. También plataformas como el dot-net CLR también tienen tipos de estructura.

Lawrence Dol
fuente
rajKumar, tu pregunta es bastante ambigua. ¿Te gusta el "tipo" como una característica de algún lenguaje, o como un concepto general?
aku
Sin embargo, no todos los tipos definidos por el usuario son clases, al menos no en todos los idiomas.
jalf
mitad, de acuerdo en que es una característica incorrecta. la interfaz también está definida por el usuario y no puede haber tipos definidos por el usuario. Clase es un tipo especializado sirviendo necesidades especiales (la creación de instancias de objetos)
aku
Una interfaz es simplemente un tipo especial, una clase puramente abstracta; sigue siendo un tipo (en el sentido más amplio).
Lawrence Dol el
Software Monkey, la interfaz no es una clase puramente abstracta, es un concepto especial. "definido por el usuario" no es una propiedad definitoria de clases
aku
3

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 está involucrada una clase, 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 una función es simplemente un puntero. Las clases generalmente tienen los conceptos de poder almacenar datos, así como las operaciones sobre esos datos.

Eclipse
fuente
3

Mis pensamientos están bastante 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 proporcionarnos una interfaz para ellos.

Python también agrega metaclases, que son solo un mecanismo para construir clases, de la misma manera que las clases construyen 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.

Xose Lluis
fuente
3

Tomado de la cita de GoF de abajo:

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: el conjunto de solicitudes a las que puede responder.

Quiero proporcionar un ejemplo usando Java:

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

Ambas clases Ae Bimplementan 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). Así, la clase Aes de tipo A y IType y la clase Bes de tipo B y IType que satisfacen:

Un objeto puede tener muchos tipos, y los objetos de diferentes clases pueden tener el mismo tipo.

La diferencia entre subtipos y subclase probablemente también ayuda a comprender ese problema:

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html

SebNag
fuente
2

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 invocar métodos definidos por su clase.

Como 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 no implicado por el tipo) y cómo se presentan los campos del objeto.

Tenga en cuenta también que el valor de un 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 lo mismo.

Jay Conrod
fuente
2

Los tipos en C, como Int Float, char, etc. definen datos sobre los que se puede actuar con métodos específicos que pueden operar sobre ellos. No es más complicado que eso. Al igual que para int, puedo sumar, restar, multiplicar y tal vez dividir. Esos son mis métodos (u operaciones) para int. Una clase es simplemente una definición de un nuevo tipo. Primero defino cómo se ven los datos. Quizás es un poco. Tal vez son dos palabras como un complejo con una parte real e imaginaria. O tal vez es esta cosa compleja con 309734325 bytes que representa la composición atómica de una partícula extraña en Júpiter. No me importa Al igual que un número entero, puedo hacer las operaciones que puedo hacer con este nuevo tipo de datos. En el caso del número entero, tenía que sumar, restar, etc. Con este nuevo tipo de datos puedo definir cualquier operación que tenga sentido. Pueden ser sumar restar, etc. pero pueden agregar otras cosas. Estos son los métodos que decido agregar a mi clase.

La conclusión es que con un tipo en C, tiene una definición de cuáles son los datos, es decir; un byte, palabra, flotante, char, etc. Pero cualquiera de estos también implica qué operaciones son legales y producirán resultados confiables.

Una clase no es diferente, excepto que depende de usted definir la interfaz y las operaciones aceptables. La clase define estas cosas y cuando lo instancia en un Objeto, define el comportamiento del objeto tal como una definición de tipo define el comportamiento de un número entero cuando lo opera.

Las clases solo te dan la flexibilidad para definir nuevos tipos y todo sobre cómo operan.

Una vez que se define esto, cada vez que instancia un objeto de clase "cosita", tiene la estructura de datos que definí y las operaciones (métodos) que dije que puedes hacer con él. La clase "cosita" es claramente nada más o menos que un nuevo tipo que C ++ me permite definir.

Aaron Bauch
fuente
1

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.

Clase refiere al conjunto de propiedades y métodos con el 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 idiomas han intentado combinar tipos y clases de varias maneras, con varios resultados beneficiosos.

demasiado php
fuente
1
Incluso en el lenguaje empobrecido tipo C, puede crear nuevos tipos, pero no tiene nada que ver con lo que la gente normalmente considera clases, excepto en cuanto a estructuras, registros y clases que se parecen entre sí.
James Iry
1

Los tipos y clases están relacionados pero no son idénticos. Mi opinión es que las clases se usan para la herencia de implementación, mientras que los tipos se usan para la sustitución del tiempo de ejecución.

Aquí hay un enlace que explica el principio de sustitución y por qué las subclases y los subtipos no siempre son lo mismo (en Java, por ejemplo). La página de wikipedia sobre covarianza y contravarianza tiene más información sobre esta distinción.

Doug Currie
fuente
1

En el sentido general del lenguaje agnóstico : la clase es una realización del tipo .

A menudo, cuando esta es la única realización de ese tipo, puede usar ambos términos para hacer referencia a él en algún contexto.

Por el contrario, por ejemplo, en el contexto de C #: la clase es solo una de las muchas implementaciones más de un concepto de tipo como primitivas, estructuras, punteros, etc.

Severo
fuente
0

Interesante pregunta. Creo que la respuesta de aku es acertada. Tome la ArrayListclase java como ejemplo

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Se ArrayListdice que una instancia de la clase es del tipo de cada superclase que extiende y cada interfaz que implementa. Por lo tanto, una instancia de la ArrayListclase 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.

Armandino
fuente
0

Diferentes clases pueden describir el mismo tipo.

El tipo consta de estas partes:

  1. Operaciones = sintaxis
  2. Descripción de operaciones = semántica

La clase consta de estas partes:

  1. Operaciones = sintaxis
  2. Implementación (= varias implementaciones describen la misma semántica)

Algunas notas:

  • La interfaz (como en Java) no es tipo, porque no describe la semántica (solo describe la sintaxis)

  • La subclase no es un subtipo, ya que la subclase puede cambiar la semántica definida en la superclase, el subtipo no puede cambiar la semántica del supertipo (consulte el Principio de sustitución de Liskov, por ejemplo, este ejemplo de LSP ).

jk_
fuente
0

Obviamente, como hay lenguajes con 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 lenguajes como Java, intes un tipo (primitivo), pero no una clase.

Por lo tanto: cada clase es un tipo, pero no todos los tipos son una clase.

Ingo
fuente
0

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 enumeración
  • Tipos de estructuras
  • Tipos anulables

Tipos de referencia:

  • Tipos de clase
  • Tipos de interfaz
  • Tipos de matriz
  • Tipos de delegado

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 modo que un valor de cualquier tipo puede tratarse como un objeto. Cada tipo en C # deriva directa o indirectamente del tipo de clase de objeto, y el objeto es la clase base definitiva de todos los tipos. Los valores de los tipos de referencia se tratan como objetos simplemente al ver los valores como objeto de tipo. Los valores de los tipos de valor se tratan como objetos mediante operaciones de boxeo y unboxing.

Entonces, como veo, el tipo es un paraguas sobre muchos elementos, cuya clase es una de ellas.

Referencia: CSahrp Language Specification doc, página 4

Amirreza
fuente
-1

Esta fue una buena pregunta para mí, que me hizo pensar mucho. Me atrevería a decir que Class es una cosa de tiempo de compilación y Type es una cosa de tiempo de ejecución. Digo esto porque escribes clases, no tipos. El compilador crea tipos de clases, y el tiempo de ejecución usa tipos para crear instancias de objetos.

Piensa otra vez
fuente
1
Bienvenido a SO. ¡Esta respuesta es muy similar a al menos otra y los usuarios de SO prefieren más lenguaje técnico que 'cosita'!
Nick