那能解释下
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常[/quote]
强制类型转换,这就是告诉编译器你”强制定义类型“了。这实际上就突破了c#的强类型编程的限制。
但是.net平台是强类型的系统,它会在给变量赋值时自动去检查一下对象的类型,保证声明兼容性。他不会像javascript那类垃圾动态语言那样,仅仅在你的代码已经走到迷宫里、你按照错误的类型而仿问属性或者函数执行时才崩溃,而是会提前在入口处就给你崩溃。
那能解释下
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常[/quote]
因为 a是parent class的instance,b和a都属于A的类型,自然可以编译通过,但是一旦运行,
b = (B)a;违反了 设计模式的里氏替换原则(子可以替换父 , 父不可以替换子)
那能解释下
A a = new A();
B b = new B();
b = (B)a;
为何能编译通过,却运行抛出异常,此时运行时(B)a在做什么?为什么会抛出异常[/quote]
以内存来说,a和b都是指向同一段内存,这是不会报错,所以你a=b在底层的语法中是没有错误的;报错得是编译器对类型的检测即c#语法,A是B的父类,所以可以定义b;
A a=new B(); // 这里真正制造出来的是B,不是A。假设A=哺乳动物,B = 狗。
B b=(B)a;
上帝创建了一个狗,先用哺乳动物表示着,等到有一天,上帝觉得狗这个名称不错,就用狗来表示之前创建的那只
A a = new A();//这里真正制造出来的是A,假设A=哺乳动物,B = 狗。
B b = new B();//这里真正制造出来的是B,假设A=哺乳动物,B = 狗。
b = (B)a;你觉得哺乳动物可以转换成狗么
面向对象是一种用来分析世界的方法~
你可以多考虑现实中的例子
如果单单看A转B ,B转A的,很难明白了解面向对象的
A a=new B();
B b=(B)a;
这个在内存上是没有变化的~ 只是穿马甲而已~
float f = 10;
int i =(int)f;//虽然i也是10,但内存上已经被去掉了很多个bit了~
当然这是值类型的,像上面的引用类型的~真真正正的父转子是要报错的,