Pure virtuale o astratto, cosa c'è in un nome?

14

Durante la discussione su una domanda sulle funzioni virtuali su Stack Overflow, mi sono chiesto se esistesse un nome ufficiale per puro (abstract ) e funzioni virtuali non puri.

Ho sempre fatto affidamento su wikipedia per le mie informazioni, che affermano che le funzioni virtuali pure e non pure sono il termine generico . Sfortunatamente, l'articolo non lo supporta con un'origine o riferimenti.

Per citare la risposta di Jon Skeet alla mia risposta che puro e non puro sono i termini generali usati:

@Steven: Hmm... possibly, but I've only ever seen it in the context of C++ before. I suspect anyone talking about them is likely to have a C++ background :)

I termini provenivano da C ++, o erano prima definiti o implementati in una lingua precedente, e sono i termini scientifici "ufficiali"?

UPDATE:

Frank Shearar ha fornito un utile collegamento alla descrizione della SIMULA 67 Common Base Language (1970). Questa lingua sembra essere la prima lingua a introdurre parole chiave OO come classe , oggetto e anche virtuale come concetto formale. non definisce puro / non puro o astratto , ma supporta i concetti .

Chi li ha definiti?

    
posta Steven Jeuris 09.02.2011 - 20:28
fonte

3 risposte

7

Quindi ... ho fatto una piccola ricerca. Quello che segue è una piccola lezione di storia per gli interessati. :) Vai alla conclusione in fondo se sei interessato solo alla risposta.

1967 :

SIMULA 67 , il primo linguaggio di programmazione orientato agli oggetti definisce le parole chiave come classe , < em> oggetto , chiama per riferimento , chiama per valore e virtuale .

Il sistema ereditarietà di SIMULA era originariamente conosciuto con un nome diverso, concatenazione (e più tardi noto come prefisso ), in riferimento al fatto che il codice dei supertipi è stato copiato e "concatenato" con il codice dei sottotipi. Successivamente un'altra forma di sistema di ereditarietà emerso, delegazione , in cui le chiamate sono delegate in base al tipo corretto.

Virtuale molto probabilmente si riferisce al processo che deve essere eseguito per inviare una chiamata all'implementazione corretta usando un tabella dei metodi virtuali . È virtuale rispetto a un'implementazione fissa / concreta.

1971 :

Niklaus Wirth, scrive su un concetto definito come perfezionamento graduale . Spiega in modo basilare come dividere un programma in soluzioni parziali su cui può essere esteso.

1974 :

Questo è il primo documento che ho trovato con il termine abstract tipi di dati di Barbara Liskov .

An abstract data type defines a class of abstract objects which is completely characterized by the operations available on those objects. This means that an abstract type can be defined by defining the characterizing operations for that type. When a programmer makes use of an abstract data object, he is concerned only with the behavior which that object exhibits but not with any details of how that behavior is achieved by means of an implementation.

Questo documento definisce anche un cluster operativo che sembra specificare ciò che ora conosciamo come un'interfaccia .

Interessante terminologia scientifica (carta del 1996):

Eredità : un meccanismo di livello più basso grazie al quale oggetti o classi possono condividere comportamenti o dati.

Sottotitoli : esprime la specializzazione concettuale. Una forma specifica di ereditarietà, anche chiamata ereditarietà dell'interfaccia .

Principi di astrazione : il processo di organizzazione della nostra conoscenza di un dominio di applicazione in classifiche gerarchiche di ordini di astrazioni, al fine di ottenere una migliore comprensione dei fenomeni in questione.

Astrazioni parzialmente implementate : astrazioni le cui definizioni sono state intenzionalmente lasciate incomplete.

Classi astratte : termine specifico per una classe parzialmente implementata in sistemi orientati agli oggetti.

Ereditarietà di : consente di ridefinire (o persino rimuovere) le operazioni in sottoclassi.

Eredità rigida : ereditarietà comportamentale compatibile

Conclusione :

Classe astratta è il termine più generico da utilizzare nei sistemi orientati agli oggetti. Sembra che le funzioni virtuali pure e non pure siano originate solo dal C ++. Ad esempio, questa intervista a Stroustrup fa sembrare che abbia inventato i termini. I documenti scientifici usano una terminologia più generale.

Virtual ha origine da SIMULA, il che fa sì che il suo utilizzo sia molto diffuso, ma non è un termine generico. Definisce già i dettagli di implementazione. Parlando in termini di tipi di eredità è più appropriato. Non virtuale per impostazione predefinita corrisponde a ereditarietà rigorosa per impostazione predefinita, mentre virtuale per impostazione predefinita corrisponde a ereditarietà non forzata .

Chiunque sia interessato a regolare la voce di Wikipedia ? :)

    
risposta data 15.02.2011 - 02:10
fonte
9

Nygaard e Dahl hanno usato per la prima volta il termine, in SIMULA 67 Common Base Language . Guardare nella sezione 2.1, ad esempio, e nella sezione 2.2.3. (Per quanto posso dire almeno, ma hey, per quanto riguarda gli OOP, è probabilmente il primo uso del termine.)

    
risposta data 09.02.2011 - 21:56
fonte
4

In C ++, le funzioni membro che sono vincolate dinamicamente e quindi possono essere sovrascritte da una sottoclasse sono chiamate "virtuali". Le funzioni virtuali che devono assolutamente essere ignorate sono chiamate "pure virtual". Si noti che una funzione virtuale pura può avere un corpo, anche se spesso non lo fa. Una classe che ha almeno una funzione virtuale pura è chiamata "abstract" e non può essere istanziata, ma derivata da.

Sto indovinando il motivo per cui le funzioni virtuali sono chiamate virtuali è il fatto che non è noto quale funzione verrà chiamata in fase di compilazione. In un certo senso, una chiamata di funzione virtuale "non esiste" al momento della compilazione.

Sto anche indovinando che il motivo per cui il termine "astratto" è usato per una classe con una pura funzione virtuale è che non puoi avere oggetti di quella classe. In un certo senso è un concetto astratto molto lontano dal mondo concreto degli oggetti.

Modifica: altre lingue.

Per quanto riguarda il significato generale del termine "virtuale", ecco i miei due centesimi. In Smalltalk tutte le funzioni utilizzano l'associazione dinamica, quindi sono tutte virtuali e non è necessario un termine speciale o una parola chiave della lingua. In Java, se non sbaglio, il compilatore decide automaticamente se utilizzare il bind dinamico, quindi per quanto riguarda il programmatore non c'è distinzione, e quindi nessuna parola chiave "virtuale".

In C ++ è necessaria la distinzione tra virtuale e non virtuale, poiché spetta al programmatore decidere quando utilizzare il bind dinamico per risparmiare sull'overhead quando non è necessario.

    
risposta data 09.02.2011 - 21:57
fonte

Leggi altre domande sui tag