Programowanie D - dziedziczenie

Jedną z najważniejszych koncepcji programowania obiektowego jest dziedziczenie. Dziedziczenie pozwala zdefiniować klasę pod względem innej klasy, co ułatwia tworzenie i utrzymywanie aplikacji. Daje to również możliwość ponownego wykorzystania funkcjonalności kodu i szybkiego czasu implementacji.

Tworząc klasę, zamiast pisać zupełnie nowe składowe danych i funkcje składowe, programista może wyznaczyć, że nowa klasa powinna dziedziczyć składowe istniejącej klasy. Ta istniejąca klasa nosi nazwębase class, a nowa klasa jest nazywana derived klasa.

Idea dziedziczenia implementuje relację. Na przykład, ssak IS-A zwierzę, pies IS-A ssak, stąd też pies IS-A zwierzę i tak dalej.

Klasy bazowe i klasy pochodne w D

Klasa może pochodzić z więcej niż jednej klasy, co oznacza, że ​​może dziedziczyć dane i funkcje z wielu klas bazowych. Aby zdefiniować klasę pochodną, ​​używamy listy pochodnych klas, aby określić klasy bazowe. Lista pochodnych klas zawiera nazwę jednej lub więcej klas bazowych i ma postać -

class derived-class: base-class

Rozważ klasę bazową Shape i jej klasa pochodna Rectangle w następujący sposób -

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Total area: 35

Kontrola dostępu i dziedziczenie

Klasa pochodna może uzyskać dostęp do wszystkich nieprywatnych elementów członkowskich swojej klasy bazowej. W związku z tym elementy członkowskie klasy bazowej, które nie powinny być dostępne dla funkcji składowych klas pochodnych, powinny być zadeklarowane jako prywatne w klasie bazowej.

Klasa pochodna dziedziczy wszystkie metody klasy bazowej z następującymi wyjątkami -

  • Konstruktory, destruktory i konstruktory kopiujące klasy bazowej.
  • Przeciążone operatory klasy bazowej.

Dziedziczenie wielopoziomowe

Dziedziczenie może być wielopoziomowe i pokazano to w poniższym przykładzie.

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

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Total area: 169