在
Java中,我获得了一项任务.我可以用它来描述我的问题,如下所示:
创建三个类A B和C.
A类具有实例变量j,k,l,setter和getter方法,以及基于它们进行计算的方法x.
B类是A的子类,并使用j,k,l覆盖具有相同空签名的方法x.
C类也是A的子类,并且有一个额外的类y,它可以处理其他垃圾.
现在,实例化一个C类对象,设置其变量,执行方法x,然后使用来自B类的方法x的覆盖版本.
我的问题是,我最后一部分怎么做?我认为这个问题不正确,或者我解释错了.我可以将类C对象转换为类B对象,然后使用类B的x()版本吗?我对铸造物体知之甚少,以及是什么决定了是否可以从一件物品投射到另一件物品.上升可能与“水平/横向”铸造一样有损,但我从未听说过后者.是否不可能在C类中使用B类中的方法而不使C类内部实例化并从其自己的变量重建B类对象?我有道理吗?
附录:
好的.所以兄弟姐妹不能彼此演员?因为C和B都是“我的对象层次结构”的一部分.我可以抛弃然后回到另一个子类吗?就像把猫送到动物类,然后把动物送到狗身上一样?因为方法x依赖于类A和类B中的实例变量,所以在C中创建B的新实例将创建一个具有未设置相同的字段/变量的对象,它们将全部为零或类似.因此,我必须将j,k和l的每个值复制到C类对象中的新B类型对象中.这似乎浪费时间和内存,将对象变量复制到另一个非常相似的对象中.但没有其他办法吗?
第二个附录:
虽然我已经选择了一个答案,但我仍然对一般的投射以及我称之为横向投射感到好奇.如果B和C都是A的子类,你可以允许从B转换为C吗?另外,一般来说如何允许施放?
第三:
所以在这一点上,几年后我明白这在Java中是不可能实现的.但是,有趣的是,在JavaScript和PHP中,您可以使用函数的“bind”方法来更改它的上下文,以便它基本上认为它是另一个对象.所以在这种情况下,我可以创建一个B:x()的副本绑定到包含我已设置的属性的C实例,然后x的绑定实例将使用C实例的所有内部变量.这真的很奇怪但有时真的很方便.