为什么这个子类的父方法调用不是多态的?
Why is this subclass' parent method call not polymorphic?
我最近一直在涉足 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;
}
我想我的问题是为什么 "this" 关键字在 C++ 后继语言中似乎没有发挥您期望的作用。
方法是多态的,变量不是。因此,您不想将语音设为变量,而是希望 child.
中的 override speak
此外,auto
return 类型不适用于多态性,您需要实际指定类型。 (原因是 auto return 在编译器中制作了一个函数模板,理论上它可以在函数 table 中有多个可覆盖的插槽,所以它只是不尝试将其放入。)
所以试试这个:
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;
}
如果您有很多共享功能,并且希望在 child 类 中稍作更改即可重用一个功能,您可以创建一个方法而不是仅 return 的变量有点东西。
喜欢string voice() { return "woof"; }
,那么可以在children中覆盖。
另一种方法是使用模板这个参数:
import std.stdio;
class Animal {
string voice;
void speak(this C)() {
writeln((cast(C)this).voice);
}
}
class Dog : Animal {
string voice = "Whoof!";
}
int main() {
auto a = new Animal();
auto d = new Dog();
a.speak(); // Prints ""
d.speak(); // Prints "Whoof!"
return 0;
}
或者当您不需要会员发言权时:
import std.stdio;
class Animal {
static immutable voice = "";
void speak(this C)() {
writeln(C.voice);
}
}
class Dog : Animal {
static immutable voice = "Whoof!";
}
int main() {
auto a = new Animal();
auto d = new Dog();
a.speak(); // Prints ""
d.speak(); // Prints "Whoof!"
return 0;
}
我最近一直在涉足 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;
}
我想我的问题是为什么 "this" 关键字在 C++ 后继语言中似乎没有发挥您期望的作用。
方法是多态的,变量不是。因此,您不想将语音设为变量,而是希望 child.
中的override speak
此外,auto
return 类型不适用于多态性,您需要实际指定类型。 (原因是 auto return 在编译器中制作了一个函数模板,理论上它可以在函数 table 中有多个可覆盖的插槽,所以它只是不尝试将其放入。)
所以试试这个:
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;
}
如果您有很多共享功能,并且希望在 child 类 中稍作更改即可重用一个功能,您可以创建一个方法而不是仅 return 的变量有点东西。
喜欢string voice() { return "woof"; }
,那么可以在children中覆盖。
另一种方法是使用模板这个参数:
import std.stdio;
class Animal {
string voice;
void speak(this C)() {
writeln((cast(C)this).voice);
}
}
class Dog : Animal {
string voice = "Whoof!";
}
int main() {
auto a = new Animal();
auto d = new Dog();
a.speak(); // Prints ""
d.speak(); // Prints "Whoof!"
return 0;
}
或者当您不需要会员发言权时:
import std.stdio;
class Animal {
static immutable voice = "";
void speak(this C)() {
writeln(C.voice);
}
}
class Dog : Animal {
static immutable voice = "Whoof!";
}
int main() {
auto a = new Animal();
auto d = new Dog();
a.speak(); // Prints ""
d.speak(); // Prints "Whoof!"
return 0;
}