2013-05-16 40 views
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); 
} 

在我的代碼我想通過使用它們與超類的關係來集中化所有類型的子類的行爲。這種奇怪的行爲對我來說是個大問題。

我忘了什麼嗎?哪裏有問題 ?

謝謝。

回答

3

變量不是多態的。 SuperClass有一個名爲id變量,並​​具有名爲id一個不同的變量,並且作爲​​從SuperClass衍生,它也有訪問SuperClass'id,但只有當它明確地訪問它(在代碼中例如經由super.id的​​內部) 。由於id不是多態,訪問它時獲得的id取決於用於訪問它的參考的類型。如果參考的類型是SuperClass,那麼它的SuperClass'id被訪問,而如果參考的類型是​​,那麼它的​​'id被訪問。

如果你想要多態行爲,你必須使用publicprotected函數。變量永遠不會是多態的。

+0

好的,謝謝你的信息:) – Munrek

+0

讓我再提一下[@property](http://dlang.org/property.html)屬性,它似乎也屬於這裏:) – vines