Ich habe mich in letzter Zeit in Dlang versucht, weil C++ einfach nicht richtig saß, nachdem ich Python so lange benutzt hatte. Beim Herumturnen stieß ich auf das, was ich für eine sehr einfache Übung im Polymorphismus hielt. Ich nehme an, wie Sie erwarten, dass etwas funktioniert und was es tatsächlich tut, sind zwei völlig verschiedene Dinge, aus Gründen, die ein Endbenutzer wahrscheinlich nicht verstehen kann. Davon abgesehen, hier ist der Quellcode meiner „sandbox.D“:Warum ist der Aufruf der übergeordneten Methode dieser Unterklasse nicht polymorph?
import std.stdio;
class Animal {
string voice = "--silence--";
void speak() {
writeln(this.voice);
}
}
class Dog : Animal {
string voice = "Whoof!";
}
int main() {
auto a = new Animal();
auto d = new Dog();
writeln(a.voice); // Prints "--silence--"
writeln(d.voice); // Prints "Whoof!"
a.speak(); // Prints "--silence--"
d.speak(); // Prints "--silence--" NOT "Whoof!"
return 0;
}
Ich denke, meine Frage ist, warum die „this“ Schlüsselwort einfach nicht zu sein scheint funktioniert, wie Sie es erwarten würde in die C++ - Nachfolgersprache.
Ah, wie eine fristgerechte Antwort! Ich habe darüber debattiert, ob einige der "auto" -Schlüsselwörter entfernt werden sollen. Letztendlich habe ich es ohne Auto versucht und die richtigen Typen deklariert, aber es hat keinen Unterschied gemacht. Ich denke, dass objektorientierte Vererbung nicht ganz so nützlich ist, wie ich es mir vorgestellt habe :( –
Es ist nützlich, ich muss nur daran denken, dass nur Methoden übersteuerbar sind, Variablen nicht. (Ich bin mir nicht sicher, ob es das gleiche ist Python, aber das funktioniert normalerweise in vielen OOP-Sprachen.) Obwohl die Vererbung ihre Grenzen hat, kann man viele Dinge damit lösen, aber es ist nicht immer der beste Weg. –
Es ist sehr nützlich. Sie müssen nur verstehen, wie man es benutzt, und Sie haben missverstanden, wie es funktioniert hat. Sie müssen nur die Funktion anstelle der Member-Variable überschreiben, und es funktioniert gut. Die Codelänge ist nicht einmal viel anders. Und wenn Sie wollen Überschreibe stattdessen eine Membervariable, wickle sie einfach in eine Funktion, um ihren Wert zurückzugeben, und benutze die Funktion, anstatt die Variable direkt zu verwenden.Aber ich habe noch nie von einer Sprache gehört, die Variablen überladen hat, und wie Polymorphie unter der Haube funktioniert würde ziemlich viel bedeuten wrappi Sie sind sowieso in Funktionen unter der Haube. –