我有三个类,一个抽象的User和两个具体的类: NormalUser持有一个或多个地址对象的ArrayList,这些地址对象可以是不同的(国内、国际、自定义等),然后是Admin类,它有一个返回true的方法。它们都包含更多与彼此无关的方法。
abstract class User{
public User(String username, String pw){
...
}
public class NormalUser extends User{
...
private ArrayList<Address> addresses;
...
public void addAdress(ArrayList<Address> address){
addresses.addAll(address);
}
public class Admin extends User{
...
public boolean getIsAdmin(){
return true;
}
}
假设我在另一个类中创建了4个用户对象,就像这样:
ArrayList<User> users;
users.add(new NormalUser( "1", "pw");
users.add(new NormalUser( "2", "pw");
users.add(new NormalUser( "3", "pw");
users.add(new NormalUser( "4", "pw");
users.add(new Admin("5", "pw"));
users.add(new NormalUser( "6", "pw");
假设我想在NormalUser中使用addAddress方法,那么我必须先将users中的特定用户向下转换为NormalUser,在像这样使用NormalUser中的addAddress方法:
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}
我希望NormalUser和Admin都成为User,这样我可以在登录时一起处理它们。
我考虑将addEmail添加到User类中,然后在NormalUser类中重写它,但是我必须为NormalUser类中的每个方法都这样做,而且Admin也会从User继承它,当它不需要该功能时。
问题1:有更好的方法吗?我听说使用instanceof是不好的,而且每次使用NormalUser类特定的方法时都必须使用instanceof。
问题2:一个对象地址的ArrayList是将RegularUser链接到特定地址/对象的最佳方式吗?
现在没有涉及到数据库。
例如,用户a有两个地址,一个国内地址和一个国际地址,用户b只有一个国内地址,用户c有一个国内地址和一个自定义地址等。
谢谢。
PS. 我已经广泛搜索了以前的帖子,但没有找到解决方案。在我的两本Java书中,它们都显示了instanceof的示例,但没有提到它是一个不好的实践。
instanceof
并不是根据定义来说一个坏东西。当多态性更合适时,您只需不要过度使用它即可。 - Bart van Heukelominstanceof
相关的问题:您应该重新考虑您的设计,使得您永远不会在基本的User
上调用addAddress
。只有当您处于专门为NormalUser
设计的代码块中时,才应该调用这样的方法。 - toto2