这是一个验证:
将子对象转换为父类型是否有任何增益?
假设我有两个班级 家长和孩子。 儿童正在扩展家长。
是否有任何区别 代码
Parent p = new Child();
和
Parent p = (Parent) new Child();
p 在调用任何内容时会有什么不同的行为 方法或以任何方式访问其任何一个成员?
从我的结尾来看,两者是相同的,在这里铸造是多余的。
// ==================================
编辑: 我一直在寻求控制,作为开发人员, 从儿童之外调用哪种方法 - 儿童或父母的方法。
因此,编码器会调用 父的方法,无论如何 是否在子类中重写该方法。那是, 子类的重写方法将被旁路,并且 该方法的父实现将是 在 Child 对象上调用。
答案 0 :(得分:3)
不,无论您通过何种方式调用方法,对象的行为都会相同。
这是设计的 - 它允许子类覆盖其超类的方法。
在您的示例中,赋值前的upcast无效 - 它将作为赋值的一部分隐式发生。
Parent p = (Parent) new Child();
调用者无法强制对象忽略其方法覆盖。这是好事物。否则,孩子永远不会强制执行自己的内部不变量。
如果您想允许调用者选择是调用父方法还是子方法,那么您的API可以提供两个方法。父母和孩子都可以确定如何支持每个人。
答案 1 :(得分:1)
回答你的第二个问题:这在设计上是不可能的。除非子代码中的代码被子代码覆盖,否则无法调用父方法。如果孩子想要允许这个,你可以提供另一个使用super来调用被覆盖的父方法的方法。当然第二种方法需要有不同的名称。
答案 2 :(得分:1)
它被称为多态性。如果孩子覆盖了一个方法,那么将始终调用子实现。无论你的变量是什么类型。 只需要反向转换 - 如果你想在一个对象上调用子方法,你知道它的类型是Child,但是Variable被声明为Partent。但是它通常是糟糕的样式来构造变量(有例外 - 就像equals方法一样)