Tôi có ba lớp, một Người dùng trừu tượng và hai lớp cụ thể: NormalUser chứa một ArrayList của một hoặc nhiều đối tượng Địa chỉ có thể khác nhau (trong nước, quốc tế, tùy chỉnh, v.v.) Lớp quản trị có phương thức trả về true. Cả hai đều chứa nhiều phương pháp không liên quan đến nhau.Java Thừa kế và tránh sử dụng liên tục 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;
}
}
Bây giờ trong lớp khác nếu tôi thực hiện 4 đối tượng sử dụng như thế này ví dụ:
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");
Và nói rằng tôi muốn sử dụng phương pháp addAddress trong NormalUser, sau đó tôi phải downCast người dùng specfic trong người dùng NormalUser, trước khi tôi có thể sử dụng phương pháp addAddress trong NormalUser như thế này:
if (user instanceof NormalUser){
NormalUser normal = (NormalUser) user;
normal.addAddress(...)
}
lý do tại sao tôi muốn cả hai NormalUser và quản lý là một tài khoản là để tôi có thể xử lý chúng cùng nhau khi đăng nhập.
Tôi đã nghĩ việc thêm addEmail vào lớp User và sau đó ghi đè nó trong lớp NormalUser, nhưng tôi sẽ phải làm điều đó cho mọi phương thức trong lớp NormalUser, cộng với Admin sẽ kế thừa nó từ Người dùng là tốt, khi nó không cần chức năng đó.
Câu hỏi 1: Có cách nào tốt hơn để làm điều này như tôi đã nghe bằng cách sử dụng instanceof là một điều xấu? và tôi sẽ phải sử dụng instanceof mỗi khi tôi sử dụng một phương thức dành riêng cho lớp NormalUser.
Quesiton 2: Là một ArrayList của đối tượng Địa chỉ cách tốt nhất để liên kết Người dùng thường xuyên với các địa chỉ cụ thể/(Đối tượng)?
Hiện không có cơ sở dữ liệu nào có liên quan.
Vì vậy, ví dụ sử dụng một có 2 địa chỉ một trong nước và một quốc tế, và người sử dụng b chỉ có một địa chỉ trong nước, sử dụng c có trong nước và địa chỉ tùy chỉnh, vv
Cảm ơn.
PS. Tôi đã tìm kiếm các bài viết trước đây rộng rãi nhưng havent tìm thấy một giải pháp. Trong cả hai cuốn sách Java của tôi cả hai đều cho thấy ví dụ về cách sử dụng instanceof nhưng không đề cập đến nó là một thực hành xấu.
Đối với trường hợp cụ thể này, tôi sợ tôi không thể nói điều nào tốt hơn, nhưng không, 'instanceof' không phải là định nghĩa một điều xấu. Bạn không nên lạm dụng nó khi tính đa hình phù hợp hơn. –
Liên quan đến 'instanceof': bạn nên suy nghĩ lại về thiết kế của mình sao cho bạn không bao giờ gọi' addAddress' trên một 'User' cơ bản. Bạn chỉ nên gọi một phương thức như vậy khi bạn đang ở trong một khối mã được thiết kế đặc biệt cho 'NormalUser'. – toto2
có lý do nào tốt để Quản trị viên không có địa chỉ không? – soulcheck