D Programmierung - Vererbung

Eines der wichtigsten Konzepte in der objektorientierten Programmierung ist die Vererbung. Durch Vererbung kann eine Klasse in Bezug auf eine andere Klasse definiert werden, wodurch das Erstellen und Verwalten einer Anwendung vereinfacht wird. Dies bietet auch die Möglichkeit, die Codefunktionalität und die schnelle Implementierungszeit wiederzuverwenden.

Beim Erstellen einer Klasse kann der Programmierer festlegen, dass die neue Klasse die Mitglieder einer vorhandenen Klasse erben soll, anstatt vollständig neue Datenelemente und Elementfunktionen zu schreiben. Diese vorhandene Klasse heißtbase Klasse, und die neue Klasse wird als die bezeichnet derived Klasse.

Die Idee der Vererbung implementiert die Beziehung. Zum Beispiel Säugetier-IS-A-Tier, Hund-IS-A-Säugetier, daher auch Hund-IS-A-Tier und so weiter.

Basisklassen und abgeleitete Klassen in D.

Eine Klasse kann von mehr als einer Klasse abgeleitet werden, dh sie kann Daten und Funktionen von mehreren Basisklassen erben. Um eine abgeleitete Klasse zu definieren, verwenden wir eine Klassenableitungsliste, um die Basisklasse (n) anzugeben. Eine Klassenableitungsliste benennt eine oder mehrere Basisklassen und hat die Form -

class derived-class: base-class

Betrachten Sie eine Basisklasse Shape und seine abgeleitete Klasse Rectangle wie folgt -

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

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Total area: 35

Zugangskontrolle und Vererbung

Eine abgeleitete Klasse kann auf alle nicht privaten Mitglieder ihrer Basisklasse zugreifen. Daher sollten Mitglieder der Basisklasse, auf die die Elementfunktionen abgeleiteter Klassen nicht zugreifen dürfen, in der Basisklasse als privat deklariert werden.

Eine abgeleitete Klasse erbt alle Basisklassenmethoden mit den folgenden Ausnahmen:

  • Konstruktoren, Destruktoren und Kopierkonstruktoren der Basisklasse.
  • Überladene Operatoren der Basisklasse.

Mehrstufige Vererbung

Die Vererbung kann mehrere Ebenen haben und wird im folgenden Beispiel gezeigt.

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

Wenn der obige Code kompiliert und ausgeführt wird, ergibt sich das folgende Ergebnis:

Total area: 169