使用子类对象调用调用父类方法时遇到的问题

今天下午 coding 的时候遇到一个场景:因为历史原因或前任码农留下的 Bug,导致现有一堆非常乱的数据集,这个数据集内部还分多种类型,现在要对这些数据集进行处理,处理逻辑简化一点来说就是:每种类型的数据集,都要根据其每条数据的某个标识进行决定、是根据该条数据的 uid 查询数据库,还是根据其 name 查询数据库,此为背景。

我写了一个父类,里面有两个方法,一个方法(handleDataByUid)是通用的、根据 uid 处理数据,该方法可以被不同子类重写或调用;另一个方法(handleDataByName)也是通用的、是根据 name 处理数据,该方法也可以被不同子类重写或调用;Parent 类的简化版代码如下:

根据我对不同类型数据集的抽样分析,发现有的类型的数据集是根据 uid 查库处理,有的类型的数据集是根据 name 查库处理,我的想法是,父类中的方法只提供标准的根据 uid 处理数据或根据 name 处理数据的逻辑,子类在重写的 handleDataByUid 或 handleDataByName 方法中做一些数据校验的什么工作后,直接调用父类的 handleDataByUid 或 handleDataByName 方法。

在我处理到某个类型的数据集时,我抽样分析发现该类型数据集是根据 name 查库处理的,但我已经在子类中写了个 handleDataByUid 的空方法,于是我懒的改直接在在 handleDataByUid 中又调用了父类的 handleDataByName 方法,如下:

写完代码,当我随机找了几十个数据进行测试时发现,该类型数据集中竟然还有根据 uid 查库处理的,于是我把 Parent 类中的 handleDataByName 方法里又加了个判断,针对某种情况,再调一下父类中的 handleDataByUid 方法,如下:

于是,当我运行程序时就出现了 StackOverflowError 错误,提示”存在循环调用”且无法终止,最终造成 StackOverflowError 。然后我很快明白了,我用子类对象引用,调用父类的 handleDataByName 方法,在父类的 handleDataByName 方法中又调了 handleDataByUid 方法,我本意是调用父类中的 handleDataByUid 方法,但因为是用子类对象的引用调的,所以实际上会调用子类的 handleDataByUid 方法,如此一来就造成了循环调用,出现 StackOverflowError 。

处理办法其实很简单,我可以在子类方法中通过 super 来对父类中的两个方法进行调用。

但我想知道的是,怎么在父类 handleDataByName 方法中那行 handleDataByUid 调用,调的是父类的 handleDataByUid 方法呢?目前还在思考….

一点启示就是:

编码要有严格的规范,在使用继承时,父类和子类的作用划分要思考清楚,子类重写父类的方法,为什么要重写?想达到什么样的目的?父类中的方法负责什么功能、子类重写后又负责什么功能?都要提前思考清楚再下手编码,否则就是给自己和别人挖坑。

而现在的我,就在给前人填坑…..

完。

码先生
Author: 码先生

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注