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