在面向对象编程中,始终向下转换变量是否安全?

时间:2015-06-01 21:37:59

标签: theory compiler-theory

这更多是关于编译器理论,因为我正在玩一个。我想知道在子类中总是向下转换变量在理论上是否安全。

class Car {
  BodyType myBodyType;
}
class Corvette extends Car {
  FourWheels myBodyType;
  // normally this is rejected by most compilers
  // redefinition of myBodyType;
}

class BodyType {}
class FourWheels extends BodyType {}

目前在传统的OO编程中,如果我们知道myBodyType始终是特定类型,我们总是必须将myBodyType向下转换为FourWheels。如果这是由编译器自动完成的,那么它会安全吗?

1 个答案:

答案 0 :(得分:4)

不,这不安全,因为现在没有什么能阻止用户写作:

Car car = new Corvette();
car.myBodyType = new TwoWheels();

现在,将myBodyType中的car向下转换为类型FourWheels会导致问题行为。

您可以依赖myBodyType永远不会出现错误类型的唯一方法是保证不会将错误类型的值写入其中 - 例如使其成为构造期间设置的只读值。

顺便说一下,在类似Java的语言中,用户更优雅的方法就是:

class Car<MyBodyType extends BodyType> {
  MyBodyType myBodyType;
}
class Corvette extends Car<FourWheels> {
  ...
}