2015-03-21 11 views
5

Sono relativamente nuovo alle tecniche di programmazione orientata agli oggetti e, come ho capito, l'accoppiamento è il più grande ostacolo nella creazione di codice gestibile e riutilizzabile.L'ereditarietà aumenta l'accoppiamento?

Quando rendiamo che più classi figlio ereditano da una classe base, le classi figlio non diventano dipendenti dalla classe base? Cosa succede se devo rimuovere la classe base in un momento successivo. Questo non spezzerebbe il codice nelle classi figlie?

+0

Sottotipo standard OOP * si basa su * following [l'idea generale di] LSP. Quindi sì, cambiare il genitore (così che il bambino non può trattenere i suoi contratti precedentemente dichiarati) infrangerà la classe dei bambini. Tuttavia questo è uno strano (ma non posso sostenere che sia errato) l'uso di "accoppiamento". Forse questo significa semplicemente che l'accoppiamento è * assunto/implicito da * nelle relazioni di sottotipo di implementazione. – user2864740

+0

Sicuramente spezzerebbe il codice nelle classi figlie. Un modo per evitare questo è usare un'interfaccia piuttosto che usare una superclasse. Ma perché rimuovere una così importante superclasse? – nom

+0

Ma le interfacce consentono solo ai membri dati e non alle funzioni membro. Quindi non sconfiggerebbe l'intero scopo dell'eredità? –

risposta

5

Sì. Questo è indicato come Subclass Coupling:

Descrive la relazione tra un bambino e il genitore.

Come tutti gli accoppiamenti, influire su un'unità può influenzare le unità che dipendono da esso.

In questo caso, la rimozione della classe padre interesserebbe tutte le classi, in quanto un errore del compilatore si verificava durante la rimozione del supertipo.

Ciò significa che le classi figlio sono accoppiate al supertipo.

+0

Se c'è un tale svantaggio con l'ereditarietà, perché è così sovrascritto nel mondo OOP? Apparentemente, ogni articolo su OOP menziona l'ereditarietà da qualche parte e come un concetto magico per risolvere molti problemi. Il riutilizzo del codice è l'unico vantaggio dell'eredità? –

+0

@JobinJose In realtà non è esagerato, da quello che vedo. Solo alcune lingue consentono l'ereditarietà multipla, e ci sono un sacco di argomenti su Ereditarietà e Composizione. È solo un sistema che ci aiuta a raggiungere ciò che vogliamo. Riesco a vedere come si esalta il polimorfismo, ma il polimorfismo non può essere applicato a tutto. Può essere d'aiuto se ti riferisci a dove vedi questa "campagna pubblicitaria" –

+0

@JobinJose l'ereditarietà aiuta a ridurre le linee di codice che devono essere scritte. Inoltre, le cose di cui stai parlando sono ipotetiche. Quali sono le probabilità di dover rimuovere una super classe super importante da un codice dopo aver costruito un sacco di classi figlio che ne ereditano? – nom

1

La relazione tra una classe madre e le sue sottoclassi è conosciuto come sottoclassi dipendenza o implementazione dependecy. Come altri tipi di dipendenza, la dipendenza dall'implementazione genera un accoppiamento tra due classi. Ricordare che l'accoppiamento deve essere ridotto a tra le classi dell'architettura.

Come indicato nel libro Design Pattern, l'unico modo per ridurre questo tipo di accoppiamento utilizza il seguente principio:

programmazione di un'interfaccia, non un'implementazione.

Quindi, se si deve utilizzare l'ereditarietà, il modo migliore per farlo sta usando classi astratte come classi genitore e lasciando che le sottoclassi di ignorare solo metodi astratti.

L'utilizzo dell'ereditarietà tra classi di calcestruzzo viene anche chiamato riutilizzo codice casella bianca.

Le classi parenti spesso definiscono almeno parte della rappresentazione fisica delle loro sottoclassi. Poiché l'ereditarietà espone una sottoclasse ai dettagli dell'implementazione del genitore, si dice spesso che "l'eredità interrompe l'incapsulamento".

Quindi utilizzare codice scatola nera riutilizzo, invece, compisition oggetto pseudonimo, che non si rompe l'incapsulamento e minimizzare accoppiamento sottoclassi.

Problemi correlati