我需要多重继承,但是我正在使用Java

时间:2019-02-11 00:00:10

标签: java multiple-inheritance

我想用访问者,帐户,客户和管理员来构建一个简单的商人网站。

访客可以有一个购物篮。

如果访问者创建或提供凭据,则可以成为客户。

客户和管理员是具有凭据的帐户。

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
}

我尝试了一个Account界面,但是必须同时在Customer和Admin中实现帐户管理方法,并且我不想重复该代码。我看到Java 8中存在接口方法的默认实现,但是如果没有这种技巧,还有另一种方法可以实现这一点吗?

3 个答案:

答案 0 :(得分:3)

您必须重新考虑设计并在继承方面偏爱组合。 一个简单的规则-如何确定是否应该使用一个或另一个:继承是否回答了问题“是-” “有-”

? >

是客户和帐户吗?否。客户是拥有帐户的用户。

客户是访客吗?是的,他可能是。

因此,您应该从“访问者”那里扩展您的“客户”,并将“帐户”添加为该类的成员。

.dll

您可以添加一个界面,使其在SOLID方面变得更好:

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
}

并让您的客户和管理员来实施

interface Authenticable {
    Account getAccount();
    Account setAccount(Account account);
}

如果您仍然希望避免重复使用帐户获取程序和设置程序-只需从客户扩展Admin并覆盖class Customer extends Visitor implements Authenticable { private Account account; @Override Account getAccount(){return account}; @Override Account setAccount(Account account){this.account = account}; } -放行getBasket()

答案 1 :(得分:0)

您可能需要抽象方法来构建类

答案 2 :(得分:0)

Java没有像python这样的多重继承。这是事实。

您可以将Account从类更改为界面。并创建一个名称为'AccountImpl'的类来实现Account接口。在要定义帐户管理方法的每个类中,例如AdminCustomer,您必须具有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();

这是一个好习惯,因为您不会复制Account的实现,而且将来可能还希望在某些凭据之间进行区分。这样,您只需要创建新的AccountImpl类即可。