派生类为什么可以隐式的转换成基类??
派生类是基类的继承,既然是继承,那么派生类的取值范围就比基类大,取值范围大应该显示转换啊?
不解!!

解决方案 »

  1.   

    基类派生类对象之间的关系
    class A{}
    class B : A {}
    class C: A {}
    B b = new B();
    C c = b;  //错误,因为类型不同
    A a = b; //这样写是正确的,但是一定要注意:
    这样做有一个明显的限制 a 对象只能访问基类中的成员不能访问派生类中的成员
    这就是为什么C#完全面向对象的原因,因为C#中所有的东西都继承自System.Object,任何东西都能赋给一个object变量
      

  2.   

    这是很明显的道理嘛!
    比如:
    class Father
    {
    public void A();
    }
    class Sun:Father
    {
    public void B();
    }
    显然,Sun类是不是有A,B两个方法?而Father只有A方法
    Father f=new Father();//只能在其上调用A方法,而不能调用B方法,因为Father根本没定义B方法
    如果按你的逻辑,父类到子类的转换是合法的,那么:
    Sun s=f;或者Sun s=new Father();
    从形式上说,你可以在s上调用B方法,但实际上s引用的是new Father(),怎么可能调用B方法?根本就没定义!
    而反过来就不会出现任何问题:
    Sun s=new Sun();//可以在s上调用A,B方法
    Father f=s;或者Father f=new Sun();//从形式上就只能调用A方法,虽然引用的对象是Sun,但是不能调用,这只不过是“大材小用”,而不是刚才那种“无中生有”!
    相信楼主应该明白了吧?
      

  3.   

    这个不就是一般与特殊的关系问题嘛。一般是包含于特殊之中的。基类就是这里的一般,而派生类就是特殊。所以比如车和火车为例,把车看成基类,火车看成派生类。火车显然是车,所以火车具有车的属性和方法,可以直接转换成基类。而车不一定是火车,所以不能将车直接转换成火车,必须显示地进行cast。