Che cosa significa "un sistema di tipi [che] non ha gerarchia"?

2

Stavo leggendo i documenti di Go-lang e ho trovato nella sezione di Tipi che Go non ha una gerarchia di tipi .

Che cosa significa esattamente? È come python che i tipi sono stati controllati in fase di runtime (digitati dinamicamente) piuttosto che 'tempo di compilazione' (staticamente digitato)?

    
posta ThunderWiring 09.12.2016 - 19:22
fonte

2 risposte

4

Significa che Go non supporta eredità nel senso tradizionale orientato agli oggetti, preferendo concentrarsi su composizione invece.

Tuttavia, è possibile simulare l'ereditarietà in Go, se lo si desidera, utilizzando interfacce, strutture e incorporamento. Sarebbe piuttosto maldestro creare in questo modo elaborate gerarchie di ereditarietà.

Ulteriori letture
Inheritance orientata agli oggetti in Go

    
risposta data 09.12.2016 - 19:40
fonte
2

Ci sono due possibili risposte per questo. La prima risposta è la risposta alla tua domanda letterale:

What does “a type system [that] has no hierarchy” mean?

Significa esattamente questo: non esiste una gerarchia. Cioè non ci sono relazioni sub / super tra i tipi. O, in altre parole: è un sistema di tipo senza sottotipizzazione, proprio come C, Haskell, ML, Pascal e molte altre lingue.

Is it like python that types are been checked at run time (dynamically typed) rather than 'compile time' (statically typed)?

No. Queste due cose sono completamente indipendenti. Sono completamente ortogonali. L'hai detto tu stesso: la digitazione dinamica rispetto a quella statica si riferisce a quando avviene il controllo del tipo. Non ha assolutamente nulla a che fare con il fatto che i tipi possano avere relazioni gerarchiche o meno.

Nota: questo non ha nulla a che fare con l'ereditarietà. L'ereditarietà e la sottotipizzazione sono ortogonali. Subtyping riguarda le relazioni tra tipi . Cioè relazioni tra specifiche e restrizioni. L'ereditarietà riguarda le relazioni tra implementazioni . In pratica ti consente di ridurre la duplicazione del codice specificando solo in che modo il tuo codice è diverso da un codice esistente.

Sfortunatamente, molti linguaggi come C ++, Java, C♯, ecc. confondono i due concetti. In quelle lingue, non è possibile creare un sottotipo senza ereditare anche la sua implementazione e viceversa. (Se immagini una versione di Java in cui solo le interfacce sono tipi e classi non lo sono, allora dovresti avere un linguaggio che separa sottotipizzazione ed ereditarietà, ad esempio. Nota che questo è in realtà il modo consigliato di programmare in Java, comunque!)

Ora, la seconda risposta possibile prende in considerazione il contesto del documento all'interno del quale hai trovato quella citazione particolare. E questa risposta è fondamentalmente, che sfortunatamente gli autori di quella particolare sezione della FAQ di Go sembrano anche confondere ereditarietà e sottotipizzazione, e inoltre, sembrano confondere l'orientamento all'oggetto con l'ereditarietà. Quindi, staresti meglio ignorando quella particolare parte delle FAQ, impara il sistema dei tipi di Go e decidi tu stesso.

    
risposta data 10.12.2016 - 10:07
fonte

Leggi altre domande sui tag