Мне нужно множественное наследование, но я использую Java - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу смоделировать простой веб-сайт продавца с посетителем, учетной записью, клиентом и администратором.

Посетитель может иметь корзину.

Посетитель может стать клиентом.если он создает или предоставляет учетные данные.

Клиент и администратор - это учетная запись с учетными данными.

class Account {
    Credentials credentials;
    void logout();
    // other account management methods
}

class Admin extends Account {
}

class Visitor {
    Basket basket;
    // basket management methods
}

class Customer extends Visitor, Account {
    // needs a basket and credentials
}

Я пробовал интерфейс учетной записи, но методы управления учетной записью должны быть реализованы как в клиентеи Админ, и я не хочу дублировать этот код.Я видел, что реализация интерфейса по умолчанию существует в Java 8. Но есть ли другой способ добиться этого без этого хака?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Вы должны пересмотреть дизайн и отдать предпочтение композиции, а не наследованию.Простое правило - как определить, следует ли использовать то или иное: отвечает ли наследство на вопрос "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()

0 голосов
/ 11 февраля 2019

Java не имеет множественного наследования, как python.Это факт.

Вы можете изменить Account из класса в интерфейс.И создайте класс с именем AccountImpl, который реализует интерфейс Account.В каждом классе, для которого вы хотите определить методы управления учетными записями, например Admin или Customer, у вас должно быть поле интерфейса Account и его инициализация с помощью класса AccountImpl.примерно так:

interface Account { // account management methods } 

class AccountImpl implements Account {
//implement account interface methods
}

class Admin {
    Account account;
    public Admin() {
       account = new AccountImpl();
}

class Customers extends Visitor {
    Account account;
    public Customers() {
       account = new AccountImpl();
}

Например, если вы хотите выйти из системы, вы должны сказать `customer.getAccount (). logOut ();

Это хорошая практика, потому что вы не дублируетереализация учетной записи, а также, возможно, в будущем вы хотите сделать разницу между некоторыми учетными данными.Таким образом, вам просто нужно создать новый класс AccountImpl.

0 голосов
/ 11 февраля 2019

вам может понадобиться абстрактный метод для инфраструктуры класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...