Chr*_*ton 5 oop polymorphism inheritance d
我最近一直在涉及Dlang,因为在使用Python这么长时间之后,C++并没有和我坐在一起.在涉足时,我遇到了我认为在多态中非常简单的练习.我想你最终用户可能无法理解的原因是你会期望某些东西能起作用,它实际上做的是两件完全不同的东西.话虽这么说,这是我的"sandbox.D"的源代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
我想我的问题是为什么"this"关键字似乎没有按照C++后继语言的预期运行.
方法是多态的,变量不是.因此,不要让语音成为变量,而是想要override speak在孩子身上.
此外,auto返回类型不适用于多态,您需要实际指定类型.(原因是自动返回在编译器中创建了一个函数模板,理论上它可以在函数表中有多个可覆盖的插槽,因此它不会尝试将其放入.)
试试这个:
import std.stdio;
class Animal {
void speak() { // changed to void instead of auto
writeln("--silence--");
}
}
class Dog : Animal {
override void speak() { // the override tells it to override the base method
writeln("woof");
}
}
int main() {
auto d = new Dog();
d.speak();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果你有很多共享功能并希望在子类中稍微改变时重用一个函数,那么你可以创建一个方法而不是只返回一些东西的变量.
就像string voice() { return "woof"; },那么它可以在儿童中被覆盖.