2014-03-07 149 views
0

試圖理解鑄造和繼承。我有這兩個非常簡單的類:鑄造到基類

class BaseClass 
    { 
     public virtual void Print() 
     { 
     Console.WriteLine("Base"); 
     } 
    } 

    class DerivedClass : BaseClass 
    { 
     public override void Print() 
     { 
     Console.WriteLine("Derived"); 
     } 
    } 

當我執行下面的代碼時,它打印「派生」。

var derived = new DerivedClass(); 

    ((BaseClass)derived).Print(); 

然而

 bool isBase = derived is BaseClass; 

返回true。如果派生的是現在的類型BaseClass,爲什麼從BaseClass的方法打印不被調用?

+0

好吧,我明白了。謝謝 – PaulP

+0

和最好的事情是你有[在Jon Skeet鏈接的問題上的回答](http://stackoverflow.com/a/15140951/961113) – Habib

回答

0

類更改名稱,以把事情說清楚:

class Animal 
{ 
    public virtual void MakeNoise() 
    { 
     Console.WriteLine("Ring-ding-ding-ding-dingeringeding!"); 
    } 
} 

class Dog : Animal 
{ 
    public override void MakeNoise() // changing behavior inherited from base 
    { 
     Console.WriteLine("Bark!"); 
    } 
} 

現在它看起來並不奇怪,是嗎?派生類IS一個基類。任何狗是動物:

var dog = new Dog(); 
bool isBase = dog is Animal; 

你可以把任何狗的動物,因爲狗是動物:

var animal = (Animal)dog; 

但它仍然是一個狗。所以當你要求動物發出噪音時:

animal.MakeNoise(); 

你會聽到狗的吠聲。

+0

但是,當我這麼認爲,狗狗=新的動物();看起來是正確的,但它不是... – PaulP

+0

@newbieftw抱歉,沒有得到你 –

0

因爲您重寫了基類。你可以通過這種方式從子類中調用基類:

public override void Print() 
{ 
    base.Print(); 
}