我有2个类Test(Base)和Program(child).现在我在向下倾斜时遇到了一些问题.
Test t = new Program();// upcasting-works
Program p = (Program)t;//Downcasting-works
Program q = (Program)new Test();//Downcasting -throws exception.
Run Code Online (Sandbox Code Playgroud)
我想知道为什么抛出异常?可能它是非常基本的,但不知怎的,我没有得到.是为了那个新对象吗?
谢谢.
这是所有OO系统中的预期行为.简而言之,您无法向下转换为动态类型不匹配的内容.在这一行:
Program q = (Program)new Test();
Run Code Online (Sandbox Code Playgroud)
您正在创建一个Test实例 - 该实例显然不匹配,Program因为Test它不是派生自的Program.在运行时,计算机检测到这种情况并抛出异常.
另一方面,你有:
Test t = new Program();
Run Code Online (Sandbox Code Playgroud)
在这里,您正在创建一个Program实例 - 实例匹配,Test因为Program派生自Test.
最后,如果没有顺序,你有:
Program p = (Program)t;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,t是一个引用Test,但底层类型确实是Program- 在运行时,计算机能够确定这种情况,以便允许转换工作.
每个方格都是矩形,但反之亦然.类似地,派生类的每个实例都是基类的有效实例,但反之亦然.在你的榜样,每一个Program是一个Test,但不是所有的Tests为Program秒.
注意:澄清一下,这并不意味着你应该在OOP中从Rectangle继承Square :)这只是一个类比.具有讽刺意味的是,类比是OO设计中众所周知的问题.