Qual é a diferença entre Tipo e Classe?


Respostas:


121

A resposta a seguir é do livro Gof ( Design Patterns )

A classe de um objeto define como o objeto é implementado. A classe define o estado interno do objeto e a implementação de suas operações.

Por outro lado, o tipo de um objeto refere-se apenas à sua interface - um conjunto de solicitações às quais ele pode responder.

Um objeto pode ter muitos tipos e objetos de diferentes classes podem ter o mesmo 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
}

A função max requer um tipo com operação> com seu próprio tipo, pois uma interface faz com que qualquer classe que atenda ao requisito acima possa ser usada para gerar uma função max específica para essa classe.


56

Eu sempre penso em 'tipo' como um termo genérico para 'classes' e 'primitivos'.

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

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


7
explicação agradável e concisa :) #
22229

3
Bem, no .NET deve ser o mesmo, até as primitivas são classes (ou mais exatamente estruturas).
dalle

4
@dalle: concordou, não há diferença inerente entre tipo e classe. O exemplo de Eddie é muito dependente de C ++ / Java. Não é de todo a definição.
Robert Gould

Eu imagino que será difícil obter a definição "THE" de um 'tipo' versus uma classe. Muitas línguas têm seu próprio sistema de digitação. Uma definição que ouvi no .NET foi que um 'tipo' inclui os tipos ref e value, enquanto uma classe é usada apenas para descrever os tipos ref.
Eddie Parker

2
O int não é apenas uma abreviação de System.Int32? Em outras palavras: int foo; // Tipo é int, classe é System.Int32?
Svish

51

Inspirado na Wikipedia ...

Em termos da teoria dos tipos ;

  • Um tipo é uma interface abstrata.
    Os tipos geralmente representam substantivos, como pessoa, lugar ou coisa ou algo nominalizado,

  • Uma classe representa uma implementação do tipo.
    É uma estrutura de dados concreta e coleta de sub-rotinas

    Diferentes classes concretas podem produzir objetos do mesmo tipo abstrato (dependendo do sistema de tipos).

    * Por exemplo, pode-se implementar o tipo Stack com duas classes : SmallStack(rápido para pilhas pequenas, mas com baixa escala) eScalableStack (é bem dimensionado, mas alto para as pilhas pequenas).

    Da mesma forma, uma determinada classe pode ter vários construtores diferentes .

insira a descrição da imagem aqui

O exemplo da banana.

  • Um Banana tipo representaria as propriedades e a funcionalidade das bananas em geral.

  • As classesABCBanana e representariam maneiras de produzir bananas. (Diferentes fornecedores de bananas na vida real, ou diferentes estruturas e funções de dados para representar e desenhar bananas em um videogame).XYZBanana

    A ABCBananaclasse poderia então produzir bananas específicas, que são instâncias da ABCBanana classe ; elas seriam objetos do tipo Banana .

Não é raro o programador fornecer uma única e única implementação para um tipo. Nesse caso, o nome da classe geralmente é idêntico ao nome do tipo . Mas ainda existe um tipo (que pode ser extraído em uma interface, se necessário) e uma implementação (que implementaria a interface separada) que cria instâncias (objetos) da classe.


3
Como alguém que luta para aprender, a menos que seja dado um exemplo do mundo real, isso realmente me ajudou. Obrigado.
21815 alexc95

13

Tipo é o termo abrangente para todos os modelos ou conceitos de objetos disponíveis. Uma classe é um desses modelos de objeto. Assim é o tipo de estrutura, o tipo inteiro, o tipo de interface etc. Esses são todos os tipos

Se quiser, você pode ver o seguinte: Um tipo é o conceito pai. Todos os outros conceitos: Classe, Interface, Estrutura, Inteiro etc herdam deste concept.ie Eles são tipos


4

Tipo contém descrição dos dados (ou seja, propriedades, operações, etc.),

Classe é um tipo específico - é um modelo para criar instâncias de objetos .

Estritamente falando, classe é um conceito especial, pode ser visto como um pacote contendo subconjunto de metadados descrevem alguns aspectos de um objeto.

Por exemplo, em C #, você pode encontrar interfaces e classes. Ambos são tipos, mas a interface só pode definir algum contrato e não pode ser instanciada ao contrário das classes.

Simplesmente falando classe é um tipo especializado usado para encapsular propriedades e comportamento de um objeto.

A Wikipedia pode fornecer uma resposta mais completa:


4

Para ilustrá-lo da maneira mais rápida:

Uma estrutura é um tipo, mas uma estrutura não é uma classe.

Como você pode ver, um Type é um termo "abstrato" não apenas para definições de classes, mas também para estruturas e tipos de dados primitivos, como float, int, bool.


2
Seria bom mencionar o CLR .net como um exemplo de estrutura em que existem tipos que não são classes (o Java pode ser citado como outro, embora o .net tenha mais tipos de tipos). Uma pequena ruga no .net, porém, é que Type(em maiúsculas como mostrado) é o nome abreviado de uma classe de sistema ( System.Type) que é usada para armazenar descrições de tipos.
Super12

3

Tipo é conceitualmente um superconjunto de classe. No sentido mais amplo, uma classe é uma forma de tipo.

Intimamente relacionados às classes estão as interfaces, que podem ser vistas como um tipo muito especial de classe - puramente abstrato. Estes também são tipos.

Portanto, "type" abrange classes, interfaces e também na maioria dos idiomas primitivos. Também plataformas como o CLR dot-net também têm tipos de estrutura.


rajKumar, sua pergunta é bastante ambígua. você considera o "tipo" como uma característica de alguma linguagem ou como um conceito geral?
aku

Porém, nem todos os tipos definidos pelo usuário são classes, pelo menos não em todos os idiomas.
jalf 22/01/09

jalf, concordo que é uma característica errada. A interface também é definida pelo usuário e não pode haver tipos definidos pelo usuário. Class é um tipo especializado que atende a necessidades especiais (criação de instâncias de objetos) #
22229

Uma interface é simplesmente um tipo especial, uma classe puramente abstrata - ainda é um tipo (no sentido mais amplo).
22132 Lawrence Dol

Software Monkey, interface não é uma classe puramente abstrata - é um conceito especial. "definido pelo utilizador" não é uma propriedade que define as classes
aku

3

Para adicionar outro exemplo de distinção: em C ++, você tem tipos de ponteiro e referência que podem se referir a classes, mas não são classes por si só.

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"

Observe que apenas uma classe está envolvida, mas um número quase infinito de tipos pode ser usado. Em alguns idiomas, a função é considerada "objetos de primeira classe"; nesse caso, o tipo de uma função é uma classe. Em outros, o tipo de uma função é apenas um ponteiro. As classes geralmente têm os conceitos de poder armazenar dados, bem como as operações nesses dados.


3

Meus pensamentos estão praticamente alinhados com a resposta de aku.

Vejo as classes como um modelo para a construção de objetos, enquanto os tipos são uma maneira de classificar esses objetos e nos fornecem uma interface para eles.

O Python também adiciona metaclasses, que são apenas um mecanismo para criar classes, da mesma maneira que as classes criam objetos (e bem, classes e metaclasses são objetos).

Essa resposta à mesma pergunta no lamba, o último, me parece uma explicação perfeita.


3

Retirado da citação do GoF abaixo:

A classe de um objeto um objeto define como o objeto é implementado. A classe define o estado interno do objeto e a implementação de suas operações.

Por outro lado, o tipo de um objeto se refere apenas à sua interface - o conjunto de solicitações às quais ele pode responder.

Quero fornecer um exemplo usando Java:

public interface IType {
}

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

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

Ambas as classes Ae Bimplementar a interface e, portanto, são do tipo IType. Além disso, em Java, as duas classes produzem seu próprio tipo (respectivamente para o nome da classe). Assim, a classe Aé do tipo A e IType e a classe Bé do tipo B e IType satisfazendo:

Um objeto pode ter muitos tipos e objetos de diferentes classes podem ter o mesmo tipo.

A diferença entre subtipos e subclasses provavelmente ajuda também a entender esse problema:

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


2

Penso em um tipo como sendo o conjunto de coisas que você pode fazer com um valor específico. Por exemplo, se você tiver um valor inteiro, poderá adicioná-lo a outros números inteiros (ou executar outras operações aritméticas) ou passá-lo para funções que aceitem um argumento inteiro. Se você tiver um valor de objeto, poderá chamar métodos definidos por sua classe.

Como uma classe define o que você pode fazer com os objetos dessa classe, uma classe define um tipo. Porém, uma classe é mais do que isso, pois também fornece uma descrição de como os métodos são implementados (algo não implícito pelo tipo) e como os campos do objeto são dispostos.

Observe também que um valor de objeto pode ter apenas uma classe, mas pode ter vários tipos, pois cada superclasse fornece um subconjunto da funcionalidade disponível na classe do objeto.

Portanto, embora objetos e tipos estejam intimamente relacionados, eles realmente não são a mesma coisa.


2

Tipos em C, como Int Float, char etc definem dados que podem ser usados ​​com métodos específicos que podem operar com eles. Não é mais complicado que isso. Como para int, posso adicionar, subtrair multiplicar e talvez dividir. Esses são meus métodos (ou operações) para int. Uma classe é simplesmente uma definição de um novo tipo. Primeiro, defino como são os dados. Talvez seja um pouco. Talvez sejam duas palavras como um complexo com uma parte real e imaginária. Ou talvez seja essa coisa complexa, com 309734325 bytes, representando a composição atômica de uma partícula estranha em Júpiter. Eu não ligo Assim como um número inteiro, eu faço as operações que posso fazer com esse novo tipo de dados. No caso do número inteiro que eu adicionei, subtraí, etc. Com esse novo tipo de dados, posso definir as operações que julgar que fazem sentido. Eles podem ser adicionar subtrair etc. mas eles podem adicionar outras coisas. Esses são os métodos que eu decidir adicionar à minha classe.

A linha inferior é que, com um tipo em C, você tem uma definição de quais são os dados, ou seja; um byte, palavra, flutuação, caractere etc. Mas qualquer uma delas também implica quais operações são legais e produzirá resultados confiáveis.

Uma classe não é diferente, exceto que cabe a você definir a interface e as operações aceitáveis. A classe define essas coisas e, quando você a instancia em um Objeto, define o comportamento do objeto, assim como uma definição de tipo define o comportamento de um número inteiro quando você opera nele.

As aulas oferecem a flexibilidade de definir novos tipos e tudo sobre como eles funcionam.

Uma vez definido, toda vez que instanciamos um objeto da classe "coisinha", ele tem a estrutura de dados que eu defini e as operações (métodos) que eu disse que você pode fazer com ele. A classe "coisinha" é claramente nada mais ou menos do que um novo tipo que o C ++ me permite definir.


1

Tipo geralmente se refere à classificação de valores primitivos - números inteiros, seqüências de caracteres, matrizes, booleanos, nulos etc. Geralmente, você não pode criar novos tipos.

Classe refere-se ao conjunto nomeado de propriedades e métodos aos quais um objeto está associado quando é criado. Geralmente, você pode definir quantas novas classes desejar, embora em alguns idiomas seja necessário criar um novo objeto e depois anexar métodos a ele.

Essa definição é principalmente verdadeira, mas algumas linguagens tentaram combinar tipos e classes de várias maneiras, com vários resultados benéficos.


1
Mesmo na linguagem empobrecida do tipo C, você pode criar novos tipos, mas não tem nada parecido com o que as pessoas normalmente pensam como classes, exceto em estruturas, registros e classes que se parecem um com o outro.
22812 James Iry

1

Tipos e classes são relacionados, mas não idênticos. Minha opinião é que classes são usadas para herança de implementação, enquanto tipos são usados ​​para substituição de tempo de execução.

Aqui está um link explicando o princípio da substituição e por que subclasses e subtipos nem sempre são a mesma coisa (em Java, por exemplo). A página da wikipedia sobre covariância e contravariância tem mais informações sobre essa distinção.


1

No sentido geral agnóstico da linguagem - Classe é uma realização do Tipo .

Frequentemente, quando essa é a única realização desse tipo, você pode usar os dois termos para referenciá-lo em algum contexto.

Pelo contrário, por exemplo, no contexto de C # - Class é apenas uma das muitas mais implementações de um conceito de Type, como primitivas, estruturas, ponteiros etc.


0

Pergunta interessante. Eu acho que a resposta do aku está certa. Tome a ArrayListclasse java como um exemplo

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

ArrayListDiz-se que uma instância da classe é do tipo de toda superclasse que ela se estende e de toda interface que implementa. Portanto, uma instância da ArrayListclasse tem um tipo ArrayList, RandomAccess, Cloneable, e assim por diante. Em outras palavras, os valores (ou instâncias) pertencem a um ou mais tipos, as classes definem o que são esses tipos.


0

Classes diferentes podem descrever o mesmo tipo.

O tipo consiste nas seguintes partes:

  1. Operações = sintaxe
  2. Descrição das operações = semântica

A classe consiste nas seguintes partes:

  1. Operações = sintaxe
  2. Implementação (= várias implementações descrevem a mesma semântica)

Algumas notas:

  • A interface (como em Java) não é do tipo, porque não descreve semântica (descreve apenas sintaxe)

  • A subclasse não é subtipo, porque a subclasse pode alterar a semântica definida na superclasse, o subtipo não pode alterar a semântica do supertipo (consulte o Princípio de substituição de Liskov, por exemplo, este exemplo de LSP ).


0

Obviamente, como existem linguagens com sistema de tipos que não são linguagens de programação OO, tipo deve ser um conceito mais amplo que classe

Mesmo em linguagens como Java, int é um tipo (primitivo), mas não uma classe.

Portanto: toda classe é um tipo, mas nem todo tipo é uma classe.


0

Se pensarmos nessa questão no contexto de C #, chegaremos à resposta abaixo.

O sistema do tipo C # é dividido nas seguintes categorias:

Tipos de valor:

  • Tipos simples: como int, long, float, etc.
  • Tipos de enum
  • Tipos de estrutura
  • Tipos anuláveis

Tipos de referência:

  • Tipos de classe
  • Tipos de interface
  • Tipos de matriz
  • Tipos de delegados

Como você pode ver, existem muitos tipos em C #, que Class é apenas um deles. Há apenas uma observação importante: o sistema de tipos do C # é unificado para que um valor de qualquer tipo possa ser tratado como um objeto. Todo tipo em C # deriva direta ou indiretamente do tipo de classe de objeto, e object é a classe base final de todos os tipos. Valores de tipos de referência são tratados como objetos simplesmente visualizando os valores como objeto de tipo. Os valores dos tipos de valor são tratados como objetos executando operações de boxe e unboxing.

pelo que vejo, type é um guarda-chuva sobre muitos itens, cuja classe é um deles.

Referência: CSahrp Language Specification doc, página 4


-1

Essa foi uma boa pergunta para mim, o que me fez pensar bastante. Ousaria dizer que Class é uma coisa compilada e Type é uma coisa de tempo de execução. Eu digo isso porque você escreve classes, não tipos. O compilador cria tipos de classes e o tempo de execução usa tipos para criar instâncias de objetos.


1
Bem-vindo ao SO. Essa resposta é muito semelhante a pelo menos uma outra e os usuários de SO preferem uma linguagem mais técnica do que 'coisinha'!
Nick
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.