D 通过超类操作子类时,值会发生变化
我遇到了一个奇怪的问题。 当将子类传递给接受超类的方法时(这是可以的,因为子类是超类),子类的变量似乎会改变。。。 举一个更明确的例子:D 通过超类操作子类时,值会发生变化,d,D,我遇到了一个奇怪的问题。 当将子类传递给接受超类的方法时(这是可以的,因为子类是超类),子类的变量似乎会改变。。。 举一个更明确的例子: import std.stdio; void main () { SuperClass myspc = new SuperClass(); showSupID(myspc); // shows 0, ok SubClass mysbc = new SubClass(); showSupID(mysbc); // shows
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);
}
在我的代码中,我想通过使用它们与超类的关系来集中所有类型的子类的操作。这种奇怪的行为对我来说是个大问题
我忘了什么吗?问题出在哪里?
谢谢。变量不是多态的
超类
有一个名为id
的变量,子类
有一个名为id
的不同变量,子类
是从超类
派生出来的,因此它也可以访问超类
“id
,但只有当它显式访问它时才可以(例如,通过super.id
在子类
中的代码)。由于id
不是多态的,访问它时获得的id
取决于用于访问它的引用的类型。如果引用的类型是超类
,则访问的是超类
”id
,而如果引用的类型是子类
,则访问的是Sub类
“id
,可访问
如果您想要多态行为,您必须使用public
或protected
函数。变量从来都不是多态的。让我再提一下属性,它似乎也属于这里:)