我想用访问者,帐户,客户和管理员来构建一个简单的商人网站。
访客可以有一个购物篮。
如果访问者创建或提供凭据,则可以成为客户。
客户和管理员是具有凭据的帐户。
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中存在接口方法的默认实现,但是如果没有这种技巧,还有另一种方法可以实现这一点吗?
答案 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
接口。在要定义帐户管理方法的每个类中,例如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();
这是一个好习惯,因为您不会复制Account的实现,而且将来可能还希望在某些凭据之间进行区分。这样,您只需要创建新的AccountImpl
类即可。