2014-03-07 118 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(); 
}