Risposte:
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.
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
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 .
L'esempio della banana.
UN
Banana
tipo rappresenterebbe le proprietà e le funzionalità delle banane in generale.Le classi
ABCBanana
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
ABCBanana
classe potrebbe quindi produrre banane particolari che sono istanze dellaABCBanana
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.
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
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:
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.
Type
(in maiuscolo come mostrato) è il nome breve di una classe di sistema ( System.Type
) che viene utilizzato per contenere le descrizioni dei tipi.
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.
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.
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.
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 A
e B
implementano 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
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.
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.
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.
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.
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.
Domanda interessante. Penso che la risposta di Aku sia perfetta. Prendi la ArrayList
classe java come esempio
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Si ArrayList
dice che un'istanza della classe sia del tipo di ogni superclasse che estende e di ogni interfaccia che implementa. Pertanto, un'istanza della ArrayList
classe ha un tipo ArrayList
, RandomAccess
, Cloneable
e così via. In altre parole, i valori (o le istanze) appartengono a uno o più tipi, le classi definiscono quali sono questi tipi.
Classi diverse possono descrivere lo stesso tipo.
Tipo composto da queste parti:
La classe è composta da queste parti:
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 ).
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.
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 di riferimento:
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
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.