1

我遇到了一个奇怪的问题。当将子类传递给接受超类的方法时,这没关系,因为子类是超类,子类的变量似乎发生了变化......有一个更明确的例子:

import std.stdio;

void main () {
    SuperClass myspc = new SuperClass();
    showSupID(myspc); // shows 0, ok

    SubClass mysbc = new SubClass();
    showSupID(mysbc); // shows 0 again, wtf ?

    showSubID(mysbc); // shows 3, ok
}

class SuperClass {
    int id;
}

class SubClass : SuperClass {
    int id = 3;
}

void showSupID(SuperClass object){
    writeln(object.id);
}

void showSubID(SubClass object){ // I want to avoid to have subclass specific methods
    writeln(object.id);
}

在我的代码中,我想通过使用它们与超类的关系来为所有类型的子类集中一个动作。这种奇怪的行为对我来说是个大问题。

我忘了什么吗?问题出在哪里 ?

谢谢。

4

1 回答 1

3

变量不是多态的。SuperClass有一个名为 的变量id,并且SubClass有一个名为 的不同变量id,并且作为SubClass派生自SuperClass,它也可以访问SuperClass' id,但前提是它显式访问它(例如,通过super.id内部的代码SubClass)。而且 asid不是多态的,id您在访问它时得到的取决于用于访问它的引用的类型。如果引用是 type SuperClass,则访问的是SuperClass' id,而如果引用是 type SubClass,则访问的是SubClass' id

如果你想要多态行为,你必须使用publicorprotected函数。变量永远不是多态的。

于 2013-05-16T20:50:24.340 回答