子类重写父类的方法,父类中的同名方法该调用哪一个方法?
- 这个问题源于软件构造Lab3中对于checkrep的误用,将错误的设置为了public类型的(子类型和夫类型均是public)。应该为private类型的才是正确的。
- 在Lab3中,子类型DutySet调用CheckRep检查表示不变性是否存在重叠。(Override的)

乍一看似乎没有任何问题。checkOverlap抛出异常,如果抛出了异常那么表示不变性不能通过。如果没抛出异常则是正常通过的。但是,我们跟踪下CheckOverlap的代码:

这里将checkoverlap委托给nois进行实现。我们继续步入checkoverlap的代码观察情况:

这里调用了DutySet的父类即Commonset的labels代码。观察父类的labels代码:

执行checkrep后,发现控制又回到了子类中重写的checkrep处。造成了无限的递归。
一些隐含的间接递归
将上述中的checkrep改成私有的以后,又出现了新的stackoverflow问题。跟踪错误信息。如图所示


上面的checkrep调用下面的checkoverlap,下面的checkoverlap又回去调用checkrep,这就造成了间接的递归。
- 最终改正的结果是委托nois实现checkoverlap,如图所示:
-
一个子类,需要implements一个接口,继承一个父类。需要重写一个与父类和接口签名完全一致的方法,实质上了重写父类中的方法优先。

- 如图所示,在dutyset中有一个重写的insert方法在接口和父类中都有完全一致的签名。
- 在这里,我们委托一个具体的对象nois实现无重复的插入操作,而nois的插入操作又委托给一个Commonset对象来完成,并且这个nois必须指向的是dutyset自身。(想指向他的父类 调用父类中的方法,但无能为力啊!)
- 由于DutySet是CommonSet对象的子类,nois委托的操作调用了DutySet中重写的方法。造成了无限递归。
本文探讨了在子类中重写父类方法时出现的递归问题,特别是当子类方法调用被重写的父类方法时导致的无限递归现象。文章通过具体案例解释了如何正确地在子类中实现方法,避免调用父类被重写的方法。
1295

被折叠的 条评论
为什么被折叠?



