Programmazione D - Ereditarietà

Uno dei concetti più importanti nella programmazione orientata agli oggetti è l'ereditarietà. L'ereditarietà consente di definire una classe in termini di un'altra classe, il che semplifica la creazione e la manutenzione di un'applicazione. Ciò offre anche l'opportunità di riutilizzare la funzionalità del codice e tempi di implementazione rapidi.

Quando si crea una classe, invece di scrivere membri dati e funzioni membro completamente nuovi, il programmatore può designare che la nuova classe erediti i membri di una classe esistente. Questa classe esistente è chiamatabase class e la nuova classe è indicata come derived classe.

L'idea di eredità implementa la è una relazione. Ad esempio, mammifero È-A animale, cane È-A mammifero quindi anche cane È-A animale e così via.

Classi di base e classi derivate in D

Una classe può essere derivata da più classi, il che significa che può ereditare dati e funzioni da più classi base. Per definire una classe derivata, utilizziamo un elenco di derivazione della classe per specificare la o le classi di base. Un elenco di derivazione di classi nomina una o più classi di base e ha la forma:

class derived-class: base-class

Considera una classe base Shape e la sua classe derivata Rectangle come segue -

import std.stdio;

// Base class 
class Shape { 
   public: 
      void setWidth(int w) { 
         width = w; 
      }

      void setHeight(int h) { 
         height = h; 
      }
   
   protected: 
      int width; 
      int height; 
}
  
// Derived class 
class Rectangle: Shape { 
   public: 
      int getArea() { 
         return (width * height); 
      } 
}
  
void main() { 
   Rectangle Rect = new Rectangle();
   
   Rect.setWidth(5); 
   Rect.setHeight(7); 
   
   // Print the area of the object. 
   writeln("Total area: ", Rect.getArea()); 
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Total area: 35

Controllo degli accessi ed ereditarietà

Una classe derivata può accedere a tutti i membri non privati ​​della sua classe base. Pertanto, i membri della classe base che non dovrebbero essere accessibili alle funzioni membro delle classi derivate dovrebbero essere dichiarati privati ​​nella classe base.

Una classe derivata eredita tutti i metodi della classe base con le seguenti eccezioni:

  • Costruttori, distruttori e costruttori di copia della classe base.
  • Operatori sovraccaricati della classe base.

Ereditarietà multilivello

L'eredità può essere di più livelli ed è mostrata nell'esempio seguente.

import std.stdio;

// Base class 
class Shape {
   public:
      void setWidth(int w) {
         width = w; 
      }

      void setHeight(int h) {
         height = h; 
      }

   protected: 
      int width; 
      int height; 
}

// Derived class 
class Rectangle: Shape {
   public:
      int getArea() {
         return (width * height); 
      }
}
 
class Square: Rectangle {
   this(int side) {
      this.setWidth(side); 
      this.setHeight(side); 
   }
}

void main() {
   Square square = new Square(13);

   // Print the area of the object.
   writeln("Total area: ", square.getArea());
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Total area: 169