Вы должны пересмотреть дизайн и отдать предпочтение композиции, а не наследованию.Простое правило - как определить, следует ли использовать то или иное: отвечает ли наследство на вопрос "is-a" или "has-a" ?
Клиент и аккаунт?Нет. Клиент - это Пользователь, который МОЖЕТ ИМЕТЬ и Учетную запись.
Является ли Клиент Посетителем?Да, он может быть.
Таким образом, вы должны продлить своего Клиента от посетителя и добавить учетную запись в качестве члена класса.
class Account {
Credentials credentials;
void logout();
// other account management methods
}
class Admin {
private Account account; // + Getters and setters
}
class Visitor {
Basket basket;
// basket management methods
}
class Customer extends Visitor {
private Account account; // + Getters and setters
}
Вы можете добавить интерфейс, чтобы сделать его еще лучше с точки зрения SOLID :
interface Authenticable {
Account getAccount();
Account setAccount(Account account);
}
и заставить своих клиентов и администраторов реализовать его
class Customer extends Visitor implements Authenticable {
private Account account;
@Override
Account getAccount(){return account};
@Override
Account setAccount(Account account){this.account = account};
}
Если вы все еще хотите избежать дублирования получателей и установщиков Учетных записей - просто расширьте Admin от Клиента и переопределите getBasket()
- thow NotImplementedException()