我有三個類,一個抽象用戶和兩個特定的:NormalUser持有一個或多個地址對象的ArrayList可以不同(國內,國際,自定義等),然後具有返回true的方法的Admin類。它們都包含更多彼此無關的方法。Java繼承和避免不斷使用instanceof
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方法,那麼我不得不垂頭喪氣的specfic用戶用戶NormalUser,我纔可以使用addAddress方法NormalUser這樣的:
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}
爲什麼我想NormalUser和管理既要用戶的原因是這樣我就可以對其進行處理
我想將addEmail添加到User類中,然後在NormalUser類中重寫它,但是我必須對NormalUser類中的每個方法都這樣做,再加上Admin將從用戶以及它不需要該功能時。
問題1:有沒有更好的方法來做到這一點,因爲我聽說使用instanceof是一件壞事?我每次使用特定於NormalUser類的方法時都必須使用instanceof。
Quesiton 2:對象的ArrayList地址是將RegularUser鏈接到特定地址/(對象)的最佳方式嗎?
目前沒有涉及數據庫。
因此,例如,用戶有2個地址中的一個國內和國際的一個,和用戶B只擁有國內地址,用戶C具有國內和自定義地址等
感謝。
PS。我已經廣泛搜索了以前的帖子,但沒有找到解決方案。在我的兩本Java書籍中,他們都展示了使用instanceof的例子,但沒有提到它是一種不好的做法。
對於這個特定的情況,恐怕我不能說哪個更好,但是不,'instanceof'在定義上並不是一件壞事。當多態性更合適時,您不應該過度使用它。 –
與'instanceof'相關:你應該重新考慮你的設計,這樣你就不會在基本的'User'上調用'addAddress'。當你在一個專門爲'NormalUser'設計的代碼塊中時,你只應該調用這樣的方法。 – toto2
有什麼理由讓管理員沒有地址? – soulcheck