Quando le vecchie divinità di programmazione inventavano la programmazione orientata agli oggetti con le classi, decisero quando si trattava di composizione e ereditarietà di avere due relazioni per un oggetto: "è un" e "ha un".
Questo ha in parte risolto il problema che le sottoclassi fossero diverse rispetto alle classi genitore, ma le rendeva utilizzabili senza la rottura del codice. Poiché un'istanza di sottoclasse "è un" oggetto superclasse e può essere sostituita direttamente per questo, anche se la sottoclasse ha più funzioni membro o membri dati, il "ha a" garantisce che eseguirà tutte le funzioni del genitore e avrà tutte le sue funzioni membri. Quindi potresti dire che Point3D "è un" Punto, e un Punto 2D "è un" Punto se entrambi ereditano da Punto. Inoltre, Point3D potrebbe essere una sottoclasse di Point2D.
L'uguaglianza tra le classi è specifica per il dominio del problema, tuttavia, e l'esempio sopra è ambiguo su ciò che il programmatore ha bisogno per il corretto funzionamento del programma. Generalmente, le regole del dominio matematico vengono seguite ei valori dei dati generano l'uguaglianza se si limita l'ambito della comparazione solo in questo caso due dimensioni, ma non se si confrontano tutti i membri dei dati.
Quindi ottieni una tabella di uguaglianze di restringimento:
Both objects have same values, limited to subset of shared members
Child classes can be equal to parent classes if parent and childs
data members are the same.
Both objects entire data members are the same.
Objects must have all same values and be similar classes.
Objects must have all same values and be the same class type.
Equality is determined by specific logical conditions in the domain.
Only Objects that both point to same instance are equal.
Di solito scegli le regole più rigide che puoi ancora svolgere tutte le funzioni necessarie nel tuo dominio problematico. I test di uguaglianza incorporati per i numeri sono progettati per essere restrittivi come possono essere per scopi matematici, ma il programmatore ha molti modi per farlo, se questo non è l'obiettivo, compresi arrotondamenti su, giù, troncamento, gt, lt, ecc. .
Gli oggetti con data e ora vengono spesso confrontati in base al tempo di generazione e quindi ogni istanza deve essere univoca, pertanto i confronti diventano molto specifici.
Il fattore di progettazione in questo caso è determinare modi efficienti per confrontare gli oggetti. A volte un confronto ricorsivo di tutti i membri di dati di oggetti è ciò che devi fare e questo può diventare molto costoso se hai un sacco di oggetti con molti membri di dati. Le alternative sono solo confrontare valori di dati rilevanti, o fare in modo che l'oggetto generi un valore hash dei suoi membri di dati interessati per un rapido confronto con altri oggetti simili, mantenere raccolte e sfoltire le raccolte per rendere i confronti più veloci e meno intensivi della CPU, e forse consentire oggetti che sono identici nei dati da eliminare e un puntatore duplicato a un singolo oggetto deve essere posizionato al suo posto.