我有三个类,一个是抽象用户,另一个是特定的类: 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");如果我想在addAddress中使用NormalUser方法,那么我必须将用户中的特定用户降为NormalUser,然后才能像这样在NormalUser中使用addAddress方法:
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}我希望NormalUser和Admin同时成为用户的原因是,我可以在登录时一起处理它们。
我想将addEmail添加到User类中,然后在NormalUser类中重写它,但是对于NormalUser类中的每个方法,我都必须这样做,而且当管理员不需要该功能时,Admin也会从用户那里继承它。
问题1:我听说使用instanceof是一件坏事,是否有更好的方法来做到这一点?每次使用特定于NormalUser类的方法时,我都必须使用instanceof。
问题2:对象地址的ArrayList是将RegularUser链接到特定地址/(对象)的最佳方式吗?
现在不涉及任何数据库。
例如,用户a有2个地址,一个是国内地址,一个是国际地址,用户b只有一个国内地址,用户c有一个国内地址和一个自定义地址等等。
谢谢。
PS。我已经广泛地搜索了以前的帖子,但没有找到解决方案。在我的两本Java书中,它们都展示了使用instanceof的例子,但没有提到它是一种糟糕的实践。
发布于 2011-12-04 16:48:09
您可以使用访客模式 --有点笨拙,有点不可读,但可能是解决问题的最佳解决方案。
实际上,将addEmail推到基类中的解决方案并没有那么糟糕。只需在基本User中提供空实现,在RegularUser中重写即可。如果要检查给定的User实例是否支持添加电子邮件,请提供另一种方法,如默认情况下返回false的supportsAddEmail和重写addEmail时的true。
发布于 2011-12-04 16:56:36
我认为最简单的解决方案是创建一个类UserList,它包含一个NormalUser列表和一个管理列表。类UserList的一个实例将替换原始列表。类UserList可以提供一些方法,例如:
处理适当列表的所有代码都将封装在UserList类中。您可以有同时使用两个列表的方法,或者只使用一个列表的方法,这取决于您需要对用户做什么。与UserList交互的类将不知道UserList中是否只有一个或两个列表。
https://stackoverflow.com/questions/8376818
复制相似问题