我有4节课

public class User {
    private Account account;

    public void setAccount(Account account) {
        this.account = account;
    }

    public Account getAccount() {
        return this.account;
    }
}
public abstract class Account {
    private double balance;
    private String password;
    private String userName;
    private String mobileNumber;
    private Provider provider;
// some getters and setters
    
}
public class BankAccount extends Account {
 
        // this not in the parent class
    private String accountNumber;

    public String getAccountNumber() {
        return accountNumber;
    }

    
    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber ;
    }
}
public class WalletAccount extends Account {

}

我是怎么把这个重新设计成这样的

Account account = new BankAcccount() ;
account.getAccountNumber() ;

没有使用instanceof或像这样的铸造

((BankAccount) account)getAccountNumber() ;

重新设计类,允许在不使用instanceof或使用设计模式强制转换的情况下调用BankAccount个方法,或者添加更多的类任何方法.

推荐答案

在简单的情况下,您可以向父类添加一个abstract方法.

public abstract class Account {
    private double balance;
    private String password;
    private String userName;
    private String mobileNumber;
    private Provider provider;
// some getters and setters
    public abstract String getAccountNumber();
}

这使得accountNumber属性变得抽象.每个非抽象子类都应该实现Account类的抽象方法.

那可以用

Account account = new BankAcccount() ;
account.getAccountNumber() ;

没有使用instanceof或像这样的铸造

((BankAccount) account)getAccountNumber() ;

这是允许的,因为abstract方法可以使用polymorphism.


另一种方法是使用接口访问某个子类的属性.如果另一个子类没有这样的属性,则它可能不会实现此接口.当您需要访问该属性时,您可以向上强制转换到不带instanceof的界面.

public interface AccountNumberAware {
  public String getAccountNumber();
}

public abstract class Account implements AccountNumberAware {
    private double balance;
    private String password;
    private String userName;
    private String mobileNumber;
    private Provider provider;
// some getters and setters

    // dummy implementation of interface
    public String getAccountNumber() {
        return null;
    }
    
}
public class BankAccount extends Account {
 
        // this not in the parent class
    private String accountNumber;

    public String getAccountNumber() {
        return accountNumber;
    }

    
    public void setAccountNumber(String accountNumber) {
        this.accountNumber = accountNumber ;
    }
}

那可以用

Account account = new BankAcccount() ;
account.getAccountNumber() ;

Java相关问答推荐

编译期间错误(Java 0000)Android .Net MAUI

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

使用联接和分页的SpringBoot Spring数据JPA

确定Java中Math.Ranb()输出的上限

编译多个.Java文件并运行一个依赖于用户参数的文件

SpringBoot+Java 17@Valid未验证POJO

暂停计时器

解释左移在Java中的工作原理

使用UTC时区将startDatetime转换为本地时间

与不同顺序的组进行匹配,不重复组但分开

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

在添加AdMob时无法为Google Play构建应用程序包:JVM垃圾收集器崩溃和JVM内存耗尽

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

Dijkstra搜索算法的实现

在Java中将.GRF转换为图像文件

JavaFX:为什么我的ComboBox添加了一个不必要的单元格的一部分?

[Guice/MissingImplementation]:未绑定任何实现

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?