【问题标题】:Casting to parent type -- Java转换为父类型——Java
【发布时间】:2013-07-30 05:17:48
【问题描述】:

这是一个验证:

将子对象转换为父类型有任何好处吗?

假设我有两个类 父母孩子Child 正在扩展 Parent

有什么区别吗 代码

Parent p = new Child();

Parent p = (Parent) new Child();

?

p 在调用任何 方法或以任何方式访问其任何成员?

从我的角度来看,两者是相同的,在这里投射是多余的。

//====================================

编辑: 作为开发人员,我一直在寻求控制权, 关于调用哪个方法 - ChildParent 的方法,来自 Child 外部。

因此,编码器将寻求调用 Parent 的方法不管 该方法是否在子类中被覆盖。那是, 子类的重写方法将被绕过,并且 该方法的 Parent 实现将是 在 Child 对象上调用。

【问题讨论】:

标签: java inheritance casting


【解决方案1】:

不,无论您调用方法的引用类型如何,对象的行为都是相同的。

这是设计使然 - 它允许子类覆盖其超类的方法。

在您的示例中,赋值之前的向上转换没有效果 - 它会作为赋值的一部分隐式发生。

Parent p = (Parent) new Child();

调用者不能强制一个对象忽略它的方法覆盖。这是一个的事情。否则,孩子永远无法强制执行自己的内部不变量。

如果你想让调用者选择是调用父方法还是子方法,那么你的API可以提供两个方法。父母和孩子都可以决定如何支持每个人。

【讨论】:

  • 请参阅我的编辑。我希望让 Child 对象偶尔运行 Parent 方法。
  • @Roam 那么你为什么不首先问这个问题呢?不要在现有问题上移动球门柱,只针对一件事提出一个问题。
  • @AndyThomas 我的意思是,他们要么移动球门柱,要么提出综合问题。或者至少是一个不清楚的问题,在完全阐述另一个问题之后,实际问题被隐藏在编辑中。所有这些都是不可取的 - 如果是温和的话,这就是为什么我所做的只是将问题指出给 OP。
【解决方案2】:

回答你的第二个问题:这在设计上是不可能的。如果父方法被子方法覆盖,则无法调用父方法,除非通过子代码中的代码。如果孩子想要允许这样做,您可以提供另一个使用 super 调用覆盖的父方法的方法。当然,第二种方法需要有一个不同的名称。

【讨论】:

  • 第二种方法也可以在parent上定义。也就是说,这听起来有点臭的设计——如果孩子的方法改变了父母方法的含义,那个应该有一个不同的名字。
  • 我想就是这样。什么 im looking for would be tempering with encapsulation of Child. so, i gather, theres 没有任何灵活性。感谢您的回复。
【解决方案3】:

这叫做多态性。如果孩子覆盖了一个方法,那么总是会调用孩子的实现。无论您的变量是什么类型。 仅在相反的情况下才需要强制转换 - 如果您想在知道其类型为 Child 但变量声明为 Partent 的对象上调用子方法。但是转换变量的方式通常很糟糕(也有例外——比如 equals 方法)

【讨论】:

  • 我想这里的几乎所有人都以某种方式听说过多态性是什么。
猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多