Questa domanda è stata risolta in " Comprensione dei tipi di dati astratti (ADT) " e la risposta più votata (di Frank Shearar) è attualmente la seguente:
Objects are not ADTs (*) [editor's note: Links to "On Understanding Data Abstraction, Revisited" - Cook]. (So in C# String and Int32 are not ADTs.)
With that out of the way, an abstract data type "has a public name, a hidden representation, and operations to create, combine and observe values of the abstraction". (Quoting from the linked paper.)
(*) Briefly, Cook explains that:
Objects cannot inspect the hidden representation of other objects, unlike members of an ADT. That implies that values of an ADT may be
implemented efficiently, even for operations that require inspection
of multiple abstract values.Objects behave like a characteristic function over the values of a type, rather than as an algebra. Objects use procedural abstraction rather than type abstraction
- ADTs usually have a unique implementation in a program. When one's language has modules, it's possible to have multiple implementations of an ADT, but they can't usually interoperate.
Il mio problema è con il secondo punto. Penso che nella carta collegata, capita solo che per l'esempio specifico di un set usato nella carta di Cook, un oggetto possa essere visto come una funzione caratteristica. Non penso che gli oggetti, in generale, possano essere visti come funzioni caratteristiche.
Inoltre, nel documento Aldritch (Il potere dell'interoperabilità: perché gli oggetti sono inevitabili) suggerisce
Cook’s definition essentially identifies dynamic dispatch as the most important characteristic of object
accettando questo e con Alan Kay quando ha detto
OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.
Tuttavia, in queste serie di diapositive delle lezioni suggerisce che le classi di Java sono ADT mentre le interfacce Java sono oggetti - e infatti l'uso di "oggetti" di interfacce può interagire (una delle caratteristiche chiave di OOP come indicato in uno dei punti elenco sopra).
Le mie domande sono
-
Sono corretto nel dire che le funzioni caratteristiche non sono una caratteristica fondamentale degli oggetti e che Frank Shearar è in errore
-
I dati che comunicano tra loro attraverso gli esempi di interfacce Java degli oggetti anche se non utilizzano la spedizione dinamica? Perché? (la mia comprensione è che la distribuzione dinamica è più flessibile e che le interfacce rappresentano un passo verso la messaggistica oggettiva C / smalltalk / erlang)
-
L'idea del principio di inversione delle dipendenze è correlata alla distinzione tra oggetti e oggetti ADT? (vedi la pagina di wikipedia o google "Gli oggetti parlanti: un racconto sulla programmazione orientata ai messaggi" Anche se sono nuovo del concetto, capisco che ciò implichi l'aggiunta di interfacce tra "strati" di un programma (vedi lo schema della pagina di wikipedia)
-
Fornisci altri esempi / chiarimenti sulla distinzione tra oggetti e ADT, se lo desideri.