如何在父类中记录已实例化的子类,以统一实现toString()方法?
问题解答
这个需求完全可以落地实现,不需要强制在每个子类中单独编写完整的toString()方法,两种常用实现思路如下:
方案1:父类统一实现toString(),子类仅返回独有属性
核心思路是在父类Account中定义一个用于获取子类独有信息的抽象方法,父类的toString()负责拼接所有账户共有的属性,再拼接子类返回的独有属性即可,不需要子类重写完整的toString()逻辑。
代码示例(Java)
// 父类Account public abstract class Account { // 所有账户共有的属性 private String accountId; private double balance; // 抽象方法:子类实现后返回自身独有属性的拼接字符串 protected abstract String getSubSpecificInfo(); @Override public String toString() { return "AccountInfo: {" + "accountId='" + accountId + '\'' + ", balance=" + balance + ", " + getSubSpecificInfo() + '}'; } // 构造方法、getter/setter省略 }
// Checking子类 public class Checking extends Account { // Checking独有属性:透支额度 private double overdraftLimit; @Override protected String getSubSpecificInfo() { return "overdraftLimit=" + overdraftLimit; } // 构造方法、getter/setter省略 }
// Savings子类 public class Savings extends Account { // Savings独有属性:年化利率 private double interestRate; @Override protected String getSubSpecificInfo() { return "interestRate=" + interestRate; } // 构造方法、getter/setter省略 }
该方案的优势是公共属性的打印逻辑仅在父类维护一次,子类仅需要实现几行代码返回自有属性即可,代码复用率最高。
方案2:父类实现基础打印逻辑,子类重写时调用父类方法
如果不想新增抽象方法,也可以选择让子类重写toString()的时候先调用父类的实现,再拼接自身独有属性,同样可以减少重复代码。
代码示例(Java)
// 父类Account的toString实现 @Override public String toString() { return "accountId='" + accountId + '\'' + ", balance=" + balance; }
// Checking子类的toString实现 @Override public String toString() { return "CheckingAccount: {" + super.toString() + ", overdraftLimit=" + overdraftLimit + '}'; }
// Savings子类的toString实现 @Override public String toString() { return "SavingsAccount: {" + super.toString() + ", interestRate=" + interestRate + '}'; }
该方案的优势是可以自定义输出的账户类型前缀,适合需要明确区分输出内容所属子类的场景,缺点是每个子类都需要重写完整的toString()方法结构。
内容的提问来源于stack exchange,提问作者user14423033
相关产品推荐
相关产品推荐

