在您的示例中,您正在创建两个派生类之一并将其存储在一个基变量中......这根本不需要任何强制转换,因为根据继承法则执行此操作非常好。基类型变量总是可以分配一个更派生的对象,因为基类能够做到的任何事情都保证派生类也可以做到,所以它是安全的。例如,数学老师可以执行普通老师可以执行的任何操作(例如 GradePapers())。用 Teacher 变量指向 Math Teacher 对象是安全的。
BasePacket bp = (BasePacket) CreateNeededChildPacket();
编辑:
为了回应您的评论,理想情况下,您应该让 CreateNeededChildPacket() 方法返回 BasePacket 类型(如果返回的对象始终来自 BasePacket)。就像基参数可以接受派生对象一样,基返回类型可以返回派生对象,这就是继承的美妙之处。对于在路上调用您的方法的人来说,这会更安全。
BasePacket CreateNeededChildPacket()
{
// do something
return AnyObjectThatDerivesFromBasePacket;
}
如果您无法更新该方法,那么您可以添加一些额外的类型检查以确保安全。
object obj = CreateNeededChildPacket();
BasePacket bp = null;
if (obj is BasePacket)
bp = (BasePacket) obj;
else
throw new Exception("Object was not a valid BasePacket type: " + obj.GetType.ToString());