Domanda

Cosa rende un tipo diverso dalla classe e viceversa?

(Nel senso generale della lingua-agnostica)

È stato utile?

Soluzione

La seguente risposta è tratta dal libro di Gof ( Design Patterns )

  

La classe di un oggetto definisce come   L'oggetto è implementato. La classe   definisce lo stato interno dell'oggetto e   la sua attuazione   operazioni.

     

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

     

Un oggetto può avere molti tipi,   e oggetti di classi diverse possono   hanno 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 soddisfa il requisito di cui sopra può essere utilizzata per generare una funzione max specifica per quella classe.

Altri suggerimenti

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

int foo; // Il tipo è int, la classe è inesistente.

MyClass foo; // Type è MyClass, la classe è MyClass

Ispirato da Wikipedia ...

In teoria dei tipi termini;

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

  • Una 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 i piccoli si impila, ma si ridimensiona male) e ScalableStack (si adatta bene ma sovraccarico elevato per piccoli stack). *

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

  

inserisci qui la descrizione dell

     

L'esempio della banana.

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

  •   
  • Le ABCBanana e XYZBanana classi 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 classe ABCBanana potrebbe quindi produrre banane particolari che lo sono   istensioni della ABCBanana classe , sarebbero oggetti di < em> digita Banana .

  •   

Non è raro che il programmatore fornisca una sola e unica implementazione per un tipo. In questo caso il nome class è spesso identico al nome 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. Così è il tipo di struttura, il tipo intero, il tipo di interfaccia ecc. Questi sono tutti i 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, ovvero sono tipi

Tipo contiene la descrizione dei dati (ad esempio proprietà, operazioni, ecc.),

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

La lezione in senso stretto è un concetto speciale, può essere visto come un pacchetto contenente un sottoinsieme di metadata descrivendo 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 usato per incapsulare proprietà e comportamento di un oggetto.

Wikipedia può darti una risposta più completa:

Per illustrarlo nel modo più veloce:

Un Struct è un Tipo, ma un Struct non è una Classe.

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

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 molto speciale di classe - puramente astratto. Anche questi sono tipi.

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

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

Python aggiunge anche metaclasse, 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 sembra il massimo mi piace una spiegazione perfetta.

Tratto dalla citazione GoF dal basso:

  

La classe di un oggetto definisce come   L'oggetto è implementato. La classe   definisce lo stato interno dell'oggetto e   la sua attuazione   operazioni.

     

Al contrario, di un oggetto   Il tipo si riferisce solo alla sua interfaccia -il   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). Pertanto la classe A è di tipo A e IType e la classe B è di tipo B e IType soddisfacenti:

  

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

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

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

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 alcune lingue, le funzioni sono considerate "oggetti di prima classe" nel qual caso, il tipo di una 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.

Penso che un tipo sia 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 della funzionalità disponibile nella classe dell'oggetto.

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

Tipo si riferisce generalmente alla classificazione di valori primitivi: numeri interi, stringhe, matrici, valori booleani, null, ecc. Di solito, non è possibile creare nuovi tipi.

Classe si 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 allegare 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.

Qui c'è 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 wikipedia sulla covarianza e la contravarianza contiene ulteriori informazioni su questa distinzione.

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

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

Si dice che un'istanza della classe ArrayList sia del tipo di ogni superclasse che estende e di ogni interfaccia che implementa. Pertanto, un'istanza della classe ArrayList 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.

Il 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 es. questo esempio LSP ).

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

Anche in lingue 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 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 # di cui Class è solo uno. 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, type è un ombrello su molti elementi di cui la classe è uno di questi.

Referece: documento di specifica della lingua CSahrp, pagina 4

In senso generale della lingua - Classe è una realizzazione del Tipo .

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

Al contrario, ad esempio, nel contesto C # - Classe è solo uno del molti altri implementazioni di un concetto Tipo come primitivi, strutture, puntatori ecc.

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 crea quindi i tipi dalle classi e il runtime usa i tipi per creare istanze di oggetti.

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 potrebbero 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 operi su di esso.

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 di classe "cosa", ha la struttura dati che ho definito e le operazioni (metodi) che ho detto che puoi farci. La classe "cosa" è chiaramente niente di più o di meno di un nuovo tipo che C ++ mi permette di definire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top