Pregunta

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

(En el sentido general del lenguaje agnóstico)

¿Fue útil?

Solución

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

  

La clase de un objeto define cómo   objeto se implementa. La clase   define el estado interno del objeto y   la implementación de su   operaciones.

     

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

     

Un objeto puede tener muchos tipos,   y 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 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 máxima específica para esa clase.

Otros consejos

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

int foo; // El tipo es int, la clase no existe.

MyClass foo; // El tipo es MyClass, la clase es MyClass

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 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 pequeños se acumula, pero se escala mal) y EscalableStack (se escala bien pero con una sobrecarga elevada para pilas pequeñas). *

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

  

ingrese la descripci&oacute;n de la imagen aqu&iacute;

     

El ejemplo del plátano.

     
      
  • Un Banana type representaría las propiedades y la funcionalidad de las bananas en general.

  •   
  • Las clases ABCBanana y XYZBanana representarían formas de producir bananas.
      (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 producir bananas particulares que son    instancias de la ABCBanana clase , serían objetos de < em> type Banana .

  •   

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

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. Es decir, son tipos

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 describiendo 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 clase es un tipo especializado usado para encapsular las propiedades y el comportamiento de un objeto.

Wikipedia puede darle una respuesta más completa:

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

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

Las interfaces están estrechamente relacionadas con las clases, que pueden considerarse 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 las plataformas como el CLR dot-net también tienen tipos de estructura.

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 parece ser lo último me gusta una explicación perfecta.

Tomado de la cita de GoF de abajo:

  

La clase de un objeto define cómo   objeto está implementado. La clase   define el estado interno del objeto y   la implementación de su   operaciones.

     

En contraste, los objetos de    tipo 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 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 satisfactorio:

  

Un objeto puede tener muchos tipos,   y 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 / course / archive / fall98 / cs441 / mainus / node12.html

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 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 poder almacenar datos, así como las operaciones sobre esos datos.

Creo que un tipo es 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.

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 no implicado 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.

Entonces, aunque los objetos y los tipos están estrechamente relacionados, en realidad no son lo mismo.

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

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 wikipedia sobre covarianza y contravarianza tiene más información sobre esta distinción.

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 , etc. En otras palabras, los valores (o instancias) pertenecen a uno o más tipos, las clases definen cuáles son estos tipos.

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, porque 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 ).

Obviamente, como hay lenguajes con sistema de tipos que no son lenguajes de programación OO, tipo 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 todos los tipos son una clase.

Si pensamos en esta pregunta en el contexto de C #, llegaremos 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 # & # 8217; s está unificado de tal manera que un valor de cualquier tipo puede ser tratado 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.

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

Referencia: CSahrp Language Specification doc, página 4

En sentido general del lenguaje - Clase es una realización del Tipo .

A menudo, cuando se trata de la realización solo de ese tipo, puede usar ambos términos para hacer referencia a ella en algún contexto.

Por el contrario, por ejemplo, en el contexto de C # - Class es solo one de muchas más implementaciones de un concepto Tipo como primitivas, estructuras, punteros, etc.

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.

Los tipos en C, como Int Float, char, etc. definen datos sobre los que se puede actuar con métodos específicos que pueden funcionar en 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 que tenía 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 lo que 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 '' claramente no es más ni menos que un nuevo tipo que C ++ me permite definir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top