Esplorazione della generalizzazione, specializzazione e dipendenza in OOP

L'OOP (programmazione orientata agli oggetti) è un paradigma centrato su oggetti e dati piuttosto che su azioni e logica. Quando si lavora con OOP, è imperativo identificare gli oggetti e le loro relazioni.

In OOP, un problema viene scomposto in una serie di oggetti e come si relazionano tra loro: un processo noto come modellazione dei dati. Le relazioni essenziali tra gli oggetti includono: associazione, generalizzazione, specializzazione, aggregazione, dipendenza e composizione. In questo articolo discuteremo le relazioni di dipendenza ed ereditarietà in OOP con esempi di codice in C # per illustrare i concetti.

Dipendenza

Una dipendenza è una relazione tra due o più oggetti in cui un oggetto dipende dall'altro oggetto o oggetti per la sua implementazione. Se uno di questi oggetti cambia, gli altri oggetti possono essere influenzati. La relazione di dipendenza tra due o più oggetti viene rappresentata in UML utilizzando frecce tratteggiate. In altre parole, quando esiste una relazione di dipendenza tra due o più oggetti, l'oggetto deve conoscere gli altri oggetti da cui dipende.

Considera le classi BlogEntry e View. Mentre il primo contiene tutte le informazioni correlate relative alle voci del blog, il secondo si occupa di visualizzare i dati ricevuti dalla classe BlogEntry sull'interfaccia utente. Pertanto, la classe View dipende dalla classe BlogEntry per visualizzare i contenuti (voci di blog) nell'interfaccia utente. Quindi esiste una relazione di dipendenza tra le classi View e BlogEntry. Una relazione di dipendenza viene rappresentata in UML utilizzando una freccia tratteggiata.

public class BlogEntry

    {

        //Members of the BlogEntry class

    }

public class View

    {

        //Members of the View class

    }

Generalizzazione e specializzazione

La generalizzazione può essere definita come la tecnica per estrarre le caratteristiche essenziali (questi includono attributi, proprietà e metodi) da due o più sottoclassi e quindi combinarle all'interno di una classe base generalizzata (chiamata anche superclasse). Al contrario, la specializzazione è il contrario della generalizzazione: è usata per rappresentare la relazione "tipo di" creando sottoclassi dalle classi base esistenti.

L'ereditarietà è definita come la capacità di una classe di estendere una o più classi (note anche come classi base). Si noti che la generalizzazione è la forma più forte di relazioni di classe poiché le classi che partecipano a una relazione di generalizzazione sono strettamente collegate tra loro: la maggior parte delle complessità interne della classe genitore sono visibili alla classe figlia.

La classe che estende la classe di base o genitore è anche nota come classe figlia o classe derivata. La classe ereditata o generalizzata estende o eredita la sua classe di base o genitore. Nell'ereditarietà, una classe figlia eredita i metodi e gli attributi della classe base o genitore ad eccezione di quelli privati. In sostanza, i membri privati ​​della classe base non vengono ereditati in quanto appartengono "esclusivamente" alla classe di cui fanno parte. Quindi, dovresti trarre vantaggio dalla generalizzazione solo quando devi rappresentare una classe che in realtà è una forma più specializzata di un'altra classe.

L'ereditarietà è dei seguenti tipi:

  • Single
  • Molteplici
  • Multilevel
  • Gerarchico
  • Ibrido

L'ereditarietà singola è la forma più semplice di ereditarietà in cui una classe estende un'altra classe. Il frammento di codice seguente illustra questa forma di ereditarietà: si noti come la classe BlogAuthor estende la classe Author.

public class Author

    {

        //Members of the Author class

    }

public class BlogAuthor : Author

    {

        //Members of the BlogAuthor class

    }

Nell'ereditarietà multipla si hanno più classi base da cui deriva una classe. Tieni presente che l'ereditarietà multipla non è supportata nei linguaggi di programmazione OOP come Java o C #.

Il prossimo tipo di ereditarietà nel nostro elenco è l'ereditarietà a più livelli. In questa forma di ereditarietà hai classi ereditate l'una dall'altra per formare una catena. Lo snippet di codice seguente lo illustra.

public class Person

    {

        //Members of the Person class

    }

public class Author : Person

    {

        //Members of the Author class

    }

public class BlogAuthor : Author

    {

        //Members of the BlogAuthor class

    }

Nell'eredità gerarchica ci sono classi che rappresentano una struttura gerarchica attraverso l'ereditarietà, simile a un albero genealogico. In questo tipo di ereditarietà, hai più di una classe figlia con la stessa classe di base o genitore. In altre parole, questo è un tipo di ereditarietà in cui una o più classi derivate hanno una base comune o una classe genitore.

L'ereditarietà ibrida è un tipo di eredità in cui due o più forme di eredità sono combinate in una sola. Essenzialmente, questo tipo di eredità è una combinazione di due o più forme di eredità per formare una struttura chiusa. Tieni presente che l'ereditarietà ibrida non è supportata anche nei linguaggi di programmazione OO come C # o Java.