当超类操作子类时,值会发生变化

时间:2013-05-16 19:40:07

标签: d

我正在困扰一个奇怪的问题。 将子类传递给接受超类的方法时,因为子类是超类,所以子类的变量似乎发生了变化...... 有一个更明确的例子:

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

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

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

感谢。

1 个答案:

答案 0 :(得分:3)

变量不是多态的。 SuperClass有一个名为id的变量,而SubClass有一个名为id的不同变量,而SubClass来自SuperClass,它也是可以访问SuperClass'id,但前提是它明确访问{(1)super.id内的代码中的SubClass。由于id不是多态的,因此访问它时id取决于用于访问它的引用类型。如果引用的类型为SuperClass,则访问的是SuperClass'id,而如果引用的类型为SubClass,则为SubClass'访问id

如果您需要多态行为,则必须使用publicprotected函数。变量永远不会是多态的。