无法从超类访问子类方法:面向对象编程电话本作业求助
解决PhoneBookEntry中无法访问PhoneNumber子类方法的问题
嘿,我之前做类似的面向对象作业时也踩过这个坑!问题的核心是你在ArrayList<ContactInfo>里存储的是父类ContactInfo类型的引用——哪怕实际对象是子类PhoneNumber,直接通过父类引用也只能调用父类定义的方法,没法直接访问子类独有的方法。下面给你两种可行的解决方案:
方案1:类型检查+向下转型
如果只是临时处理这个场景,可以在遍历contactInfos的时候,先判断当前对象是不是PhoneNumber类型,再通过向下转型获取子类对象,进而调用它的专属方法。示例代码如下:
public class PhoneBookEntry { private ArrayList<ContactInfo> contactInfos; // 构造方法、其他成员方法省略 public void displayPhoneNumbers() { for (ContactInfo info : contactInfos) { // 先判断当前对象是否为PhoneNumber实例 if (info instanceof PhoneNumber) { // 向下转型为PhoneNumber类型 PhoneNumber phoneNumber = (PhoneNumber) info; // 调用子类独有的方法,比如获取号码的getPhoneNumber() System.out.println("电话号码:" + phoneNumber.getPhoneNumber()); } } } }
这种方法简单直接,但缺点是需要手动做类型判断,不符合开闭原则——如果之后新增其他ContactInfo的子类,你得修改这个方法的判断逻辑。
方案2:利用多态(推荐)
更符合面向对象设计理念的方式,是让父类ContactInfo定义一个抽象的展示方法,然后让子类PhoneNumber去重写这个方法。这样遍历的时候直接调用父类的方法,就会自动执行子类的实现,完全不需要转型。
首先修改父类ContactInfo:
public abstract class ContactInfo { // 定义抽象的展示方法,子类必须实现 public abstract void displayContact(); }
然后让PhoneNumber重写这个方法:
public class PhoneNumber extends ContactInfo { private String phoneNumber; // 构造方法、getter等省略 @Override public void displayContact() { System.out.println("电话号码:" + this.phoneNumber); } }
最后修改PhoneBookEntry的displayPhoneNumbers()方法:
public void displayPhoneNumbers() { for (ContactInfo info : contactInfos) { // 直接调用父类方法,多态会自动触发子类的实现 info.displayContact(); } }
这种方法不仅解决了你的问题,还让代码更具扩展性——之后如果新增EmailInfo之类的子类,只要重写displayContact()方法,当前的展示方法不需要任何修改就能适配。
内容的提问来源于stack exchange,提问作者Mertcan Seğmen
相关产品推荐
相关产品推荐

