2014-06-23 12 views
5

Dal pdf di un corso di Java: http://www.ccs.neu.edu/home/riccardo/courses/csu370-fa07/lect4.pdfQuali lingue "hanno sottoclassi ma nessuna ereditarietà"?

Dice:

Per quelli di voi che seguono a casa, vorrei sottolineare che la sottoclasse non è l'ereditarietà. Vedremo l'eredità più avanti nel corso.

Naturalmente, la sottoclasse e l'ereditarietà sono correlate. Come vedremo, l'ereditarietà è un meccanismo di riutilizzo del codice che consente di riutilizzare facilmente il codice quando si definiscono sottoclassi. Ma la sottoclasse ha senso anche quando non si ha ereditarietà.

(In effetti, alcune lingue hanno sottoclassi, ma nessuna eredità, almeno, non l'ereditarietà come Java implementa.)

Subclassing è una proprietà di classi, ed è propriamente parte del sistema tipo di Java. La sottoclasse viene utilizzata da Java per determinare quali metodi possono essere invocati su un oggetto e per restituire un errore in fase di compilazione quando un oggetto non fornisce un determinato metodo.

Desidero sapere quali lingue hanno sottoclasse ma nessuna ereditarietà, almeno, non ereditarietà come gli strumenti Java? (Dal momento che non capisco bene i concetti, quindi se riesco a vederlo in alcune lingue effettive, ciò lo renderebbe più chiaro)

+0

Non vedo il punto per un tale linguaggio, ma teoricamente potrebbe essere possibile. Posso solo immaginare che un linguaggio di livello inferiore (e poco conosciuto) abbia questo comportamento. – gaborsch

+3

L'autore del corso dovrebbe aver citato almeno ** un ** esempio. In caso contrario, il test parentali fallirà nel test delle parole di donnola. Non ho mai visto una * lingua * con sottoclassi ma non ereditarietà. * Digita i sistemi *, ma non le lingue. [COM] (http://en.wikipedia.org/wiki/Component_Object_Model), ad esempio, ha un concetto di sottoclasse ma è neutrale rispetto alla lingua e non all'interno della stessa COM supporta direttamente l'ereditarietà (non credo). –

+0

Suppongo che dipenda anche dalla tua definizione di "lingua". In quanto sopra, sto pensando "language" = "linguaggio di programmazione", ma la parola è più generale di quella. "Lingue di definizione dell'interfaccia", ad esempio, si definiscono spesso "lingue", ma riguardano esclusivamente la specifica di interfacce; non eseguono alcuna implementazione (e quindi nessuna eredità, solo sottoclassi). Ma anche l'HTML si definisce "linguaggio", mentre chiaramente non è un linguaggio * di programmazione *. –

risposta

3

Questa è una distinzione senza alcuna differenza. Chiaramente sta parlando dell'ereditarietà dei metodi solo quando usa la parola "ereditarietà". Lui non sta usando il termine nel modo canonico introdotta da Wegner87, che è inestricabilmente intrecciata con la creazione di sottoclassi:

Ereditarietà: Una classe può ereditare le operazioni da “superclassi” e può avere le sue operazioni ereditate da “sottoclassi”. Un oggetto della classe C creato dall'operazione "C new" ha C come sua "classe base" e può usare le operazioni definite nella sua classe base così come le operazioni definite nelle superclassi.

Gli insegnanti di CS spesso hanno strane nozioni. Questo è stato uno di loro.

+1

@downvoter Non è bello girare il messenger. Prendilo con [professore emerito Peter Wegner] (http: //en.wikipedia.org/wiki/Peter_Wegner) – EJP

+0

Penso che il problema non sia con quello che ha detto Wegner, ma con come lo stai applicando. Hai detto che è una distinzione senza differenze, ma chiaramente * c'è * una differenza, poiché abbiamo lingue con ereditarietà ma senza sottoclassi. Almeno alcuni dei linguaggi prototipo, per esempio. (JavaScript è probabilmente uno degli esempi più famosi, credo che il Sé sia ​​stato il primo.) Se possiamo avere ereditarietà senza sottoclassi (senza avere classi per niente), allora chiaramente c'è una differenza in aggiunta a una distinzione. –

+0

Ma questo in realtà va alla scarsa qualità dell'osservazione nel corso collegato all'OP, in primo luogo. Solo buttare fuori un commento del genere senza supporto è semplicemente una cattiva pratica. –