Programmation D - Héritage

L'un des concepts les plus importants de la programmation orientée objet est l'héritage. L'héritage permet de définir une classe en termes d'une autre classe, ce qui facilite la création et la maintenance d'une application. Cela offre également la possibilité de réutiliser la fonctionnalité de code et un temps de mise en œuvre rapide.

Lors de la création d'une classe, au lieu d'écrire des membres de données et des fonctions membres complètement nouveaux, le programmeur peut désigner que la nouvelle classe doit hériter des membres d'une classe existante. Cette classe existante s'appelle lebase class, et la nouvelle classe est appelée derived classe.

L'idée d'héritage met en œuvre une relation. Par exemple, un mammifère IS-A animal, un chien IS-A mammifère donc un chien IS-A également et ainsi de suite.

Classes de base et classes dérivées en D

Une classe peut être dérivée de plusieurs classes, ce qui signifie qu'elle peut hériter des données et des fonctions de plusieurs classes de base. Pour définir une classe dérivée, nous utilisons une liste de dérivation de classe pour spécifier la ou les classes de base. Une liste de dérivation de classe nomme une ou plusieurs classes de base et a la forme -

class derived-class: base-class

Considérez une classe de base Shape et sa classe dérivée Rectangle comme suit -

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()); 
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Total area: 35

Contrôle d'accès et héritage

Une classe dérivée peut accéder à tous les membres non privés de sa classe de base. Ainsi, les membres de la classe de base qui ne devraient pas être accessibles aux fonctions membres des classes dérivées doivent être déclarés privés dans la classe de base.

Une classe dérivée hérite de toutes les méthodes de classe de base avec les exceptions suivantes -

  • Constructeurs, destructeurs et constructeurs de copie de la classe de base.
  • Opérateurs surchargés de la classe de base.

Héritage à plusieurs niveaux

L'héritage peut être de plusieurs niveaux et il est illustré dans l'exemple suivant.

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());
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Total area: 169