为什么这个子类的父方法调用不是多态的?

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