Cos'è la diseredità nella programmazione orientata agli oggetti? [chiuso]

-5

Sono confuso su Virtual Inheritance e Disheritance? Sono entrambi uguali?

    
posta Pranay Neema 26.06.2016 - 21:07
fonte

1 risposta

2

Eredità virtuale

L'ereditarietà virtuale è una tecnica per risolvere il problema del diamond of death che può sorgere quando tramite l'ereditarietà multipla è possibile ereditare più volte la stessa classe base.

Ad esempio, supponiamo di avere una classe Person e due classi derivate di essa: Student e Employee . Ora puoi avere una classe StudentWorker che eredita da Student AND da Employee . Quindi questa classe eredita il doppio della classe Person . Ma in realtà dovrebbe esserci solo un Person , con un nome univoco e la data di nascita, ecc ... È possibile ottenere questo con l'ereditarietà virtuale.

class Person {...};  
class Student: public virtual Person {...}; 
class Employee: public virtual Person {...}; 
class StudentWorker: public Student, public Employee {...}; 

Disinheritance

L'idea della diseredità è sbarazzarsi di un membro ereditato . Il problema è che la diseredità violerebbe il principio di sostituzione di Liskov e interrompe le ipotesi di base sugli oggetti derivati. Questo è certamente il motivo per cui non è supportato dai moderni linguaggi OOP mainstream per quanto ne so (ad esempio Java ). ( sembra comunque esistere un brevetto per un'implementazione di runtime del concetto )

Esistono diverse strategie che possono aiutare a raggiungere il bisogno di fondo:

  • Una soluzione usuale consiste nel sostituire la funzione da desinteggiare e attivare un'eccezione nel caso in cui venga chiamata.
  • Un altro approccio consiste nel decomporsi di ciò che è ereditato e (sopra) usa l'ereditarietà multipla in combinazione con un'architettura mixin

Alcuni affermano che il bisogno di diseredare è il sintomo di un difetto di progettazione. Alternative da considerare:

  • ereditarietà privata, per nascondere l'ereditarietà a valle della gerarchia dell'eredità.
  • composizione, l'uso di alcuni membri del proxy per indirizzare l'oggetto composto frequentemente affronta problemi di ereditarietà (des), specialmente quando il principio di composizione l'ereditarietà non è applicata rigorosamente.

Somiglianze

Quindi in generale, e in assenza di una definizione autorevole del termine, la diseredità non ha nulla a che fare con l'ereditarietà virtuale.

Tuttavia, l'ereditarietà virtuale può essere in qualche modo analizzata come un modo per sbarazzarsi di più classi di base ridondanti. Quindi posso immaginare che in questo contesto molto specifico, alcune persone potrebbero considerarlo come una sorta di diseredità. Personalmente, penso che questa terminologia sarebbe abusiva qui, perché non si tratta di eliminare l'ereditarietà, ma di "factorizing" (in senso matematico) elementi base ridondanti in un elemento base comune.

    
risposta data 26.06.2016 - 22:03
fonte

Leggi altre domande sui tag