Sup*_*ing 1 c# oop inheritance downcast
我知道已经发布了一些与此相同主题相关的问题,但我看到了不同的答案,所以我对哪个答案是正确的感到困惑.
在下面的链接中,人们提到转发不可能 转换/转换基类型为派生类型
在下面的链接中,人们提到只有当派生类是基类downcast和upcast的实例时,才可能进行 向下转换.
我做了一个小实验并使用直接转换在一个迷你项目(C#)上实现了向下转换,例如:DerivedClass dc =(DerivedClass)baseClass,而不检查DerivedClass是否是BaseClass的实例,令我惊讶的是,它正在工作很好,没有任何错误,所以为什么人们说降级是不可能的?
所以我的问题是,转发真的不可能吗?为什么人们似乎对这个话题有不同的答案?毕竟哪一个是真正的答案?有人可以更详细地解释一下吗?
示例代码:
public class Order { }
public class PurchaseOrder : Order { // some new properties here for PurchaseOrder}
public static PurchaseOrder GetOrder()
{
Order order = new Order();
return (PurchaseOrder)order;
}
Run Code Online (Sandbox Code Playgroud)
当对象实际上不是您尝试转换为的类型的实例时,如果它只是基类的一个实例,则无法进行向下转换.
这是可能的,当它的派生类已实例1.
例如,这很好:
object x = "hello";
string y = (string) x;
Run Code Online (Sandbox Code Playgroud)
这里的值x是对实例的引用string,所以向下转换string就好了.
这不好:
object x = new object();
string y = (string) x; // Bang!
Run Code Online (Sandbox Code Playgroud)
这里的值x是对实例的引用object,因此转换失败.
编辑:你现在包含在问题中的代码就像我的第二个例子 - 你正在创建一个just的实例Order并试图将其转换为PurchaseOrder.这不会奏效 - 它不是一个PurchaseOrder.但是,如果你这样改变它:
public static PurchaseOrder GetOrder()
{
Order order = new PurchaseOrder();
return (PurchaseOrder)order;
}
Run Code Online (Sandbox Code Playgroud)
... 没关系.(这是奇怪的代码,但它有效.)
有关详细信息,请参阅MSDN中的"转换和类型转换".
1或者,如果您尝试转换为对象的实际类型层次结构中的某个其他接口或类.例如,这也没关系:
object x = new MemoryStream();
Stream y = (Stream) x; // Stream is in the type hierarchy of MemoryStream
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |