【发布时间】:2019-07-04 11:09:42
【问题描述】:
我想为一个简单的商家网站建模,其中包含一个访问者、一个帐户、一个客户和一个管理员。
访客可以有一个篮子。
如果访问者创建或提供凭据,则访问者可以成为客户。
客户和管理员是具有凭据的帐户。
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 中存在接口方法的默认实现。但是如果没有这种 hack,还有其他方法可以实现吗?
【问题讨论】:
-
Java 没有多重继承。
-
客户不是帐户。不过,客户可能有一个帐户。
-
您可能需要考虑构图(可能带有装饰)。根据需要或直接从访问者和帐户实例返回字段。恕我直言,继承/定制并不适合聚合。我已经这样做了很多次了,但它通常会变得一团糟。
-
一般来说,你应该prefer composition over inheritance。继承只是代码重用的一种机制,可以说它不是一个很好的机制。还有其他重用代码的方法,通常是通过创建更多对象来表示事物的可重用部分。 (除了实现继承还有API继承,它在Java中是使用接口实现的。只要你的对象满足这些接口的约定,你就可以并且通常应该实现多个接口.)
-
用更简单的话来回答 Josh 的回答,维护一个将权限级别返回到
Account(或它可以访问的内容,例如canDeleteAccount或getPermissions)的方法,并让子类修改它为了允许您围绕它定义更高级别的行为。此外,这甚至可能导致消除具体的Administrator/Customer类,并为您提供任何形式的用户的抽象