Qual'è la differenza tra Type e Class?


Risposte:


121

La seguente risposta è dal libro Gof ( Design Patterns )

Una classe di oggetti definisce la modalità di implementazione dell'oggetto. La classe definisce lo stato interno dell'oggetto e l'implementazione delle sue operazioni.

Al contrario, il tipo di un oggetto si riferisce solo alla sua interfaccia, un insieme di richieste a cui può rispondere.

Un oggetto può avere molti tipi e oggetti di classi diverse possono avere lo stesso 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 funzione max richiede un tipo con operazione> con il proprio tipo come interfaccia di esso qualsiasi classe che soddisfi i requisiti di cui sopra può essere utilizzata per generare una funzione max specifica per quella classe.


56

Penso sempre a un "tipo" come a un termine generico per "classi" e "primitivi".

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

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


7
spiegazione piacevole e concisa :)
Aku

3
Bene, in .NET dovrebbe essere lo stesso, anche le primitive sono classi (o più esattamente strutture).
dalle

4
@dalle: d'accordo, non esiste alcuna differenza intrinseca tra tipo e classe. L'esempio di Eddie dipende molto dal C ++ / Java. Non è affatto LA definizione.
Robert Gould,

Immagino che sarà difficile ottenere "LA" definizione di un "tipo" rispetto a una classe. Tante lingue hanno il proprio sistema di battitura. Una definizione che ho sentito per .NET era che un "tipo" include sia i tipi ref che i tipi di valore, mentre una classe viene utilizzata solo per descrivere i tipi ref.
Eddie Parker,

2
Int non è solo una scorciatoia per System.Int32? In altre parole: int foo; // Tipo è int, la classe è System.Int32?
Svish,

51

Ispirato da Wikipedia ...

In termini di teoria dei tipi ;

  • UN tipo è un'interfaccia astratta.
    I tipi generalmente rappresentano nomi, come una persona, un luogo o una cosa o qualcosa di nominalizzato,

  • UN classe rappresenta un'implementazione del tipo.
    È una struttura di dati concreta e una raccolta di subroutine

    Diverse classi concrete possono produrre oggetti dello stesso tipo astratto (a seconda del sistema di tipi).

    * Ad esempio, si potrebbe implementare il tipo Stack con due classi :SmallStack (veloce per piccoli stack, ma ridimensiona male) e ScalableStack(ridimensiona bene ma alto overhead per piccoli stack). *

    Allo stesso modo, una data classe può avere diversi costruttori diversi .

inserisci qui la descrizione dell'immagine

L'esempio della banana.

  • UN Banana tipo rappresenterebbe le proprietà e le funzionalità delle banane in generale.

  • Le classiABCBanana eXYZBanana rappresenterebbero modi di produrre banane.
    (Diversi fornitori di banane nella vita reale o diverse strutture e funzioni di dati per rappresentare e disegnare banane in un videogioco).

    La ABCBananaclasse potrebbe quindi produrre banane particolari che sono istanze della ABCBanana classe , sarebbero oggetti di tipo Banana .

Non è raro che il programmatore fornisca un'unica e unica implementazione per un tipo. In questo caso il nome della classe è spesso identico al nome del tipo . Ma c'è ancora un tipo (che potrebbe essere estratto in un'interfaccia se necessario) e un'implementazione (che implementerebbe l'interfaccia separata) che costruisce istanze (oggetti) della classe.


3
Come qualcuno che lotta per imparare a meno che non sia stato dato un esempio nel mondo reale, questo mi ha davvero aiutato. Grazie.
alexc95,

13

Tipo è il termine generico per tutti i modelli o concetti di oggetti disponibili. Una classe è uno di questi modelli di oggetti. Lo stesso vale per il tipo di struttura, il tipo intero, il tipo di interfaccia ecc. Questi sono tutti tipi

Se vuoi, puoi guardarlo in questo modo: un tipo è il concetto principale. Tutti gli altri concetti: Classe, Interfaccia, Struttura, Numero intero ecc. Ereditano da questo concetto. Sono tipi


4

Tipo contiene la descrizione dei dati (cioè proprietà, operazioni, ecc.),

La classe è un tipo specifico: è un modello per creare istanze di oggetti .

La classe rigorosamente parlando è un concetto speciale, può essere visto come un pacchetto contenente un sottoinsieme di metadati descrivono alcuni aspetti di un oggetto.

Ad esempio in C # puoi trovare interfacce e classi. Entrambi sono tipi, ma l'interfaccia può solo definire alcuni contratti e non può essere istanziata a differenza delle classi.

Parlare semplicemente di classe è un tipo specializzato utilizzato per incapsulare proprietà e comportamento di un oggetto.

Wikipedia può darti una risposta più completa:


4

Per illustrarlo nel modo più veloce:

Uno Struct è un Tipo, ma uno Struct non è una Classe.

Come puoi vedere, un Tipo è un termine "astratto" non solo per definizioni di classi, ma anche per strutture e tipi di dati primitivi come float, int, bool.


2
Va bene menzionare il CLR .net come esempio di un framework in cui esistono tipi che non sono classi (Java potrebbe essere citato come un altro, sebbene .net abbia più tipi di tipi). Una piccola ruga in .net, tuttavia, è che Type(in maiuscolo come mostrato) è il nome breve di una classe di sistema ( System.Type) che viene utilizzato per contenere le descrizioni dei tipi.
supercat

3

Il tipo è concettualmente un superset di classe. In senso lato, una classe è una forma di tipo.

Strettamente legate alle classi sono le interfacce, che possono essere viste come un tipo di classe molto speciale, puramente astratto. Anche questi sono tipi.

Quindi "tipo" comprende classi, interfacce e anche nella maggior parte delle lingue primitive. Anche piattaforme come il dot-net CLR hanno anche tipi di struttura.


rajKumar, la tua domanda è abbastanza ambigua. ti piace il "tipo" come caratteristica di un linguaggio o come concetto generale?
Aku

Tuttavia, non tutti i tipi definiti dall'utente sono classi, almeno non in tutte le lingue.
jalf

jalf, d'accordo che è una caratteristica sbagliata. anche l'interfaccia è definita dall'utente e non possono esserci tipi definiti dall'utente. La classe è un tipo specializzato che serve esigenze speciali (creazione di istanze di oggetti)
aku

Un'interfaccia è semplicemente un tipo speciale, una classe puramente astratta - è ancora un tipo (in senso lato).
Lawrence Dol,

Software Monkey, l'interfaccia non è una classe puramente astratta - è un concetto speciale. "definito dall'utente" non è una proprietà che definisce le classi
aku

3

Per aggiungere un altro esempio di distinzione: in C ++ hai puntatori e tipi di riferimento che possono fare riferimento a classi, ma non sono classi in sé e per 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"

Si noti che è coinvolta solo una classe, ma è possibile utilizzare un numero quasi infinito di tipi. In alcuni linguaggi, le funzioni sono considerate "oggetti di prima classe", nel qual caso il tipo di funzione è una classe. In altri, il tipo di una funzione è semplicemente un puntatore. Le classi generalmente hanno il concetto di essere in grado di conservare i dati, così come le operazioni su tali dati.


3

I miei pensieri sono praticamente in linea con la risposta di Aku.

Vedo le classi come un modello per la costruzione di oggetti, mentre i tipi sono un modo per classificare quegli oggetti e fornirci un'interfaccia per essi.

Python aggiunge anche metaclassi, che sono solo un meccanismo per costruire classi, allo stesso modo delle classi che costruiscono oggetti (e bene, classi e metaclassi sono entrambi oggetti).

Questa risposta alla stessa domanda in Lamba il massimo mi sembra una spiegazione perfetta.


3

Tratto dalla citazione GoF dal basso:

Una classe di oggetti definisce come viene implementato l'oggetto. La classe definisce lo stato interno dell'oggetto e l'implementazione delle sue operazioni.

Al contrario, il tipo di un oggetto si riferisce solo alla sua interfaccia, l'insieme di richieste a cui può rispondere.

Voglio fornire un esempio usando Java:

public interface IType {
}

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

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

Entrambe le classi Ae Bimplementano l'interfaccia e quindi sono del tipo IType. Inoltre in Java, entrambe le classi producono il proprio tipo (rispettivamente secondo il nome della classe). Così la classe Aè di tipo A e IType e la classe Bè di tipo B e IType soddisfazione:

Un oggetto può avere molti tipi e oggetti di classi diverse possono avere lo stesso tipo.

La differenza tra sottotipi e sottoclassi probabilmente aiuta anche a capire quel problema:

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


2

Penso a un tipo come l'insieme di cose che puoi fare con un valore particolare. Ad esempio, se si dispone di un valore intero, è possibile aggiungerlo ad altri numeri interi (o eseguire altre operazioni aritmetiche) o passarlo a funzioni che accettano un argomento intero. Se si dispone di un valore oggetto, è possibile chiamare metodi definiti dalla relativa classe.

Poiché una classe definisce cosa è possibile fare con gli oggetti di quella classe, una classe definisce un tipo. Una classe è più di questo però, poiché fornisce anche una descrizione di come vengono implementati i metodi (qualcosa non implicito dal tipo) e di come sono disposti i campi dell'oggetto.

Si noti inoltre che un valore oggetto può avere solo una classe, ma può avere più tipi, poiché ogni superclasse fornisce un sottoinsieme delle funzionalità disponibili nella classe dell'oggetto.

Quindi, sebbene oggetti e tipi siano strettamente correlati, in realtà non sono la stessa cosa.


2

I tipi in C, come Int Float, char etc definiscono i dati su cui è possibile agire con metodi specifici che possono operare su di essi. Non è più complicato di così. Come per int, posso aggiungere, sottrarre moltiplicare e forse dividere. Questi sono i miei metodi (o operazioni) per int. Una classe è semplicemente una definizione di un nuovo tipo. Per prima cosa definisco l'aspetto dei dati. Forse è un po '. Forse sono due parole come un complesso con una parte reale e immaginaria. O forse è questa cosa complessa con 309734325 byte che rappresentano la composizione atomica di una strana particella su Giove. Non mi interessa. Proprio come un numero intero, riesco a recuperare le operazioni che posso fare con questo nuovo tipo di dati. Nel caso dell'intero ho aggiunto, sottratto, ecc. Con questo nuovo tipo di dati posso definire qualunque operazione ritenga sensata. Potrebbero essere aggiungere sottrarre ecc. ma possono aggiungere altre cose. Questi sono i metodi che decido di aggiungere alla mia classe.

La linea di fondo è che con un tipo in C, hai una definizione di quali sono i dati, cioè; un byte, word, float, char ecc. Ma ognuno di questi implica anche quali operazioni sono legali e produrrà risultati affidabili.

Una classe non è diversa tranne che spetta a te definire l'interfaccia e le operazioni accettabili. La classe definisce queste cose e quando le istanze in un Oggetto definisce il comportamento dell'oggetto proprio come una definizione di tipo definisce il comportamento di un numero intero quando ci operi sopra.

Le lezioni ti danno solo la flessibilità di definire nuovi tipi e tutto ciò che riguarda il loro funzionamento.

Una volta definito questo, ogni volta che istanzio un oggetto della classe "cose", ha la struttura dati che ho definito e le operazioni (metodi) che ho detto che puoi farci. La classe "cose" non è chiaramente niente di più o di meno di un nuovo tipo che C ++ mi permette di definire.


1

Il tipo si riferisce generalmente alla classificazione dei valori primitivi: numeri interi, stringhe, matrici, valori booleani, null, ecc. In genere, non è possibile creare nuovi tipi.

Classe riferisce all'insieme denominato di proprietà e metodi a cui è associato un oggetto quando viene creato. Di solito puoi definire tutte le nuove classi che desideri, anche se alcune lingue devi creare un nuovo oggetto e quindi collegare metodi ad esso.

Questa definizione è per lo più vera, ma alcune lingue hanno tentato di combinare tipi e classi in vari modi, con vari risultati benefici.


1
Anche nel linguaggio impoverito del tipo C puoi creare nuovi tipi, ma non ha nulla di simile a ciò che le persone normalmente pensano come classi se non in quanto strutture, record e classi si assomigliano.
James Iry,

1

Tipi e classi sono correlati ma non identici. La mia opinione è che le classi vengano utilizzate per l'ereditarietà dell'implementazione, mentre i tipi vengono utilizzati per la sostituzione di runtime.

Ecco un link che spiega il principio di sostituzione e perché le sottoclassi e i sottotipi non sono sempre la stessa cosa (ad esempio in Java). La pagina di Wikipedia sulla covarianza e la contraddizione contiene ulteriori informazioni su questa distinzione.


1

In senso generale dal punto di vista linguistico - Class è una realizzazione del Tipo .

Spesso quando questa è l' unica realizzazione di quel tipo, puoi usare entrambi i termini per fare riferimento in qualche contesto.

Al contrario, ad esempio, nel contesto C # - Class è solo una delle molte più implementazioni di un concetto di tipo come primitive, strutture, puntatori ecc.


0

Domanda interessante. Penso che la risposta di Aku sia perfetta. Prendi la ArrayListclasse java come esempio

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

Si ArrayListdice che un'istanza della classe sia del tipo di ogni superclasse che estende e di ogni interfaccia che implementa. Pertanto, un'istanza della ArrayListclasse ha un tipo ArrayList, RandomAccess, Cloneablee così via. In altre parole, i valori (o le istanze) appartengono a uno o più tipi, le classi definiscono quali sono questi tipi.


0

Classi diverse possono descrivere lo stesso tipo.

Tipo composto da queste parti:

  1. Operazioni = sintassi
  2. Descrizione delle operazioni = semantica

La classe è composta da queste parti:

  1. Operazioni = sintassi
  2. Implementazione (= varie implementazioni descrivono la stessa semantica)

Alcune note:

  • L'interfaccia (come in Java) non è di tipo, perché non descrive la semantica (descrive solo la sintassi)

  • La sottoclasse non è un sottotipo, poiché la sottoclasse può cambiare la semantica definita nella superclasse, il sottotipo non può cambiare la semantica del supertipo (vedere Principio di sostituzione di Liskov, ad esempio questo esempio di LSP ).


0

Ovviamente, poiché esistono linguaggi con sistema di tipi che non sono linguaggi di programmazione OO, tipo deve essere un concetto più ampio della classe

Anche in linguaggi come Java, intè un tipo (primitivo), ma non una classe.

Quindi: ogni classe è un tipo, ma non ogni tipo è una classe.


0

Se pensiamo a questa domanda in un contesto C #, arriviamo a una risposta più breve.

Il sistema di tipo C # è suddiviso nelle seguenti categorie:

Tipi di valore:

  • Tipi semplici: come int, long, float, ecc.
  • Tipi di enum
  • Tipi di strutture
  • Tipi nullabili

Tipi di riferimento:

  • Tipi di classe
  • Tipi di interfaccia
  • Tipi di array
  • Tipi di delegati

Come puoi vedere ci sono molti tipi in C # la cui Classe è solo una. C'è solo una nota importante: il sistema di tipi di C # è unificato in modo tale che un valore di qualsiasi tipo possa essere trattato come un oggetto. Ogni tipo in C # deriva direttamente o indirettamente dal tipo di classe di oggetti e l'oggetto è la classe di base definitiva di tutti i tipi. I valori dei tipi di riferimento vengono trattati come oggetti semplicemente visualizzando i valori come oggetto tipo. I valori dei tipi di valore vengono trattati come oggetti eseguendo operazioni di boxing e unboxing.

quindi, come vedo, digitare è un ombrello su molti elementi di cui la classe è una.

Referece: documento di specifica della lingua CSahrp, pagina 4


-1

Questa è stata una buona domanda per me, che mi ha fatto riflettere intensamente. Oserei dire che Class è una cosa da compilare e Type è una cosa da runtime. Lo dico perché scrivi classi non tipi. Il compilatore quindi crea i tipi dalle classi e il runtime usa i tipi per creare istanze di oggetti.


1
Benvenuti in SO. Questa risposta è molto simile ad almeno un'altra e gli utenti SO preferiscono un linguaggio più tecnico di "cose"!
Nick
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.