¿Cuál es la diferencia entre Tipo y Clase?


¿Qué hace que un tipo sea diferente de la clase y viceversa?

(En el sentido general del lenguaje-agnóstico)

Author: yesraaj, 2009-01-22

17 answers

La siguiente respuesta es del libro Gof (Patrones de diseño )

La clase de un objeto define cómo object está implementado .Clase define el estado interno del objeto y la aplicación de su operación.

En contraste, un objeto type solo se refiere a su interfaz-a conjunto de solicitudes a las que puede responder.

Un objeto puede tener muchos tipos, y objetos de diferentes clases pueden tener lo 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 Max requiere un tipo con operación > con su propio tipo como una de sus interfaces cualquier clase que satisfaga el requisito anterior se puede usar para generar una función max específica para esa clase.

 99
Author: yesraaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-21 06:51:59

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

 49
Author: Eddie Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 06:25:12

Inspirado en Wikipedia...

En teoría de tipos términos;

  • A type es una interfaz abstracta.
    Los tipos generalmente representan sustantivos, como una persona, lugar o cosa, o algo nominalizado,

  • A class representa una implementación del tipo.
    Es una estructura de datos concreta y una colección de subrutinas

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

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

    De manera similar, una clase dada puede tener varios constructores diferentes.

introduzca la descripción de la imagen aquí

El ejemplo de banana.

  • A Banana type representaría las propiedades y funcionalidad de los plátanos en general.

  • El ABCBanana y XYZBanana las clases 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).

    La clase ABCBanana podría entonces producir plátanos particulares que son las instancias de la ABCBanana clase, serían los objetos de tipo Banana .

No es raro que el programador proporcione una implementación única para un tipo. En este caso, el nombre class es a menudo idéntico al nombre type . 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 construye instancias (objetos) de la clase.

 31
Author: mins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-05 10:10:02

Type es el término general para todas las plantillas o conceptos de objetos disponibles. Una clase es una de estas 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, Entero, etc heredan de este concepto.es decir, Son tipos

 13
Author: Lonzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 06:42:09

El tipo contiene la 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 describe algunos aspectos de un objeto.

Por ejemplo, en C# puede encontrar interfaces y clases. Ambos son tipos, pero la interfaz solo puede definir algún contrato y no puede ser instanciado a diferencia de las clases.

Simply speaking class es un tipo especializado utilizado para encapsular propiedades y comportamiento de un objeto.

Wikipedia puede darte una respuesta más completa:

 4
Author: aku,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 06:22:18

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 estructuras y tipos de datos primitivos como float, int, bool.

 4
Author: icelava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 07:01:54

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

Estrechamente relacionadas con las clases están las interfaces, que pueden verse como un tipo muy especial de clase - una puramente abstracta. Estos también son tipos.

Así que "type" abarca clases, interfaces y en la mayoría de los lenguajes primitivos también. También plataformas como el punto-net CLR tienen tipos de estructura también.

 3
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 07:00:50

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 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 el último me parece como una explicación perfecta.

 3
Author: Xose Lluis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-01 23:03:28

Para agregar otro ejemplo de distinción: en C++ tiene tipos de puntero y 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 lenguajes, 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 ser capaz de sostener datos, así como las operaciones con esos datos.

 2
Author: Eclipse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 07:09:38

Tomado de la cita del GoF de abajo:

La clase de un objeto define cómo object está implementado .Clase define el estado interno del objeto y la aplicación de su operación.

En contraste, un objeto type solo se refiere a su interfaz-la 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 A y B implementar la interfaz y por lo tanto son del tipo IType. Adicionalmente 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 satisfactorio:

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

La diferencia entre subtipos y subclases probablemente ayuda a entender ese problema como bien:

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

 2
Author: SebNag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-23 16:17:26

Creo que un tipo es el conjunto de cosas que puedes hacer con un valor en particular. Por ejemplo, si tiene un valor entero, puede agregarlo a otros enteros (o realizar otras operaciones aritméticas), o pasarlo a funciones que aceptan un argumento entero. Si tiene un valor de objeto, puede llamar a métodos que están definidos por su clase.

Debido a que una clase define lo que se puede hacer con objetos de esa clase, una clase define un tipo. 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 implícito por 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.

Así que aunque los objetos y los tipos están estrechamente relacionados, en realidad no son la misma cosa.

 1
Author: Jay Conrod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 06:43:20

Type generalmente se refiere a la clasificación de valores primitivos - enteros, cadenas, arrays, booleanos, null, etc. Por lo general, no se puede crear ningún tipo nuevo.

Class 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 tiene que crear un nuevo objeto y luego adjuntar métodos a él.

Esta definición es en su mayoría cierta, pero algunos los idiomas han intentado combinar tipos y clases de varias maneras, con varios resultados beneficiosos.

 1
Author: too much php,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 06:46:51

Los tipos y 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.

Aquí hay un enlace que explica el principio de sustitución y por qué las subclases y 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.

 1
Author: Doug Currie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 18:12:05

Pregunta Interesante. Creo que la respuesta de Aku es acertada. 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 extiende y 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.

 0
Author: armandino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-22 07:57:11

Diferentes clases pueden describir el mismo tipo.

El tipo consta de las siguientes partes:

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

La clase consta de las siguientes partes:

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

Algunas notas:

  • Interfaz (como en Java) no es tipo, porque no describe la semántica (describe solo 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 (véase el Principio de Sustitución de Liskov, por ejemplo, este ejemplo de LSP).

 0
Author: jk_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-16 09:18:02

Obviamente, como hay lenguajes con tipo system que no son lenguajes de programación OO, type debe ser un concepto más amplio que class

Incluso en lenguajes como Java, int es un tipo (primitivo), pero no una clase.

Por lo tanto: cada clase es un tipo, pero no cada tipo es una clase.

 0
Author: Ingo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 16:30:30

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 estructura
  • Tipos nullables

Tipos de referencia:

  • Tipos de clase
  • Tipos de interfaz
  • Tipos de matriz
  • Tipos de delegados

Como puede ver, hay muchos tipos en C# que Clase es solo uno de ellos. Solo hay una nota importante: El sistema de tipos de C#está unificado de tal manera que un valor de cualquier tipo puede ser tratado como un objeto. Cada tipo en C# se deriva directa o indirectamente del tipo de clase de objeto, y el objeto es la clase base última de todos los tipos. Los valores de los tipos de referencia se tratan como objetos simplemente viendo los valores como objeto de tipo. Los valores de los tipos de valor se tratan como objetos mediante la realización de operaciones de boxeo y unboxing.

Así que como veo, type es un paraguas sobre muchos elementos que la clase es uno de ellos.

Referencia: CSahrp Language Specification doc, página 4

 0
Author: Amirreza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-11 08:00:11