In questo talk: link , Douglas Crockford afferma che l'orientamento agli oggetti basato sulla classe può essere rappresentato in termini dell'eredità prototipale. La costruzione che dà è qualcosa del tipo:
var theObject = function() {
var private1 = ...;
var private2 = ...;
...
return {
public1: ...,
public2: ...,
...
};
};
Dichiara inoltre che il contrario non è vero: l'ereditarietà prototipale non può essere codificata in generale solo con costrutti basati su classi. Ci ho pensato per un po ', e mi sembra che entrambe le affermazioni siano sbagliate.
-
La presunta "codifica" dell'orientamento agli oggetti basato sulla classe è errata dal punto di vista della semantica operazionale. In un tipico linguaggio orientato agli oggetti basato sulla classe, le variabili e le funzioni membro sono conosciute per esistere, in modo che possano essere utilizzate direttamente. La "codifica" prototipale si basa sul test al runtime se un membro è presente in un oggetto / tabella hash. Ergo, la semantica è diversa.
-
L'ereditarietà del prototipo può essere codificata in un linguaggio orientato agli oggetti basato sulla classe.
Userò C ++ come esempio, ma potrei usare qualsiasi altro linguaggio orientato agli oggetti basato sulla classe.
struct prototypal
{
std::shared_ptr<prototypal> base;
std::unordered_map<std::string, boost::any> members;
boost::any & operator [] (const std::string & key)
{
auto it = members.find (key);
if (it == members.end ())
{
if (base)
return (*base) [key];
else
throw std::logic_error { "Member not found." };
}
else
return *it;
}
};
La mia analisi è sbagliata? Mi manca qualcosa?