对Lab3中一些StackOverflow问题的思考

本文探讨了在子类中重写父类方法时出现的递归问题,特别是当子类方法调用被重写的父类方法时导致的无限递归现象。文章通过具体案例解释了如何正确地在子类中实现方法,避免调用父类被重写的方法。

子类重写父类的方法,父类中的同名方法该调用哪一个方法?

  • 这个问题源于软件构造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中重写的方法。造成了无限递归。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值