我目前有以下两个实体:
Titular和Familiar(家庭/亲戚/亲戚)。
熟悉[0 .. *] [1]主题
这2个类具有一个人的共同属性(firstName,lastName,birthDate ....),它们是2种会员
我想统一一个超类(概括)人员中的人员,但是我不知道是我应该让Titular和Familiar扩展人员还是将Person添加为它们的属性。
人也必须自己存在(不能抽象),并且并非所有人都是会员
但!我还需要一种方法来建立/处理Titular和Familiar的共同行为。
人[1] [0 .. *]
人员[1] [0 .. *]熟悉
Titular [1] [0 .. *]熟悉
因此怀疑是:
public class Titular extend Person
public class Familiar extend Person {
要么
public class Titular implement Affiliate {
private Person person;
public class Familiar implement Affiliate {
private Titular t;
private Person person;
或(第三个想法)
public class Person {
public abstract class Affiliate {
protected Person person;
public class Titular extends Affiliate {
最佳答案
我的看法是,所有会员也都是个人(或者您对此有例外吗?)!因此正确的层次结构是:
Person --- Affiliate --- Titular
\- Familiar
现在,关于继承或拥有一个指针……这就是所谓的复合v / s继承,两者都有很好的论据。选择组成的主要原因是
可变关系或可选关系:说,汽车的所有者可以更改,或者汽车可以没有所有者。猫不能停止成为动物而成为其他动物。
不同的公共API:在做更多工作的同时,组合允许您手动转发要从内部指针公开的任何API,并根据需要隐藏或更改“父”对象。
通常,当ClassA IS-A ClassB时,您会发现继承更有意义,因此您既不会期望更改,也不会希望两个类都提供不同的API。您会在任何地方看到此建议,并且看起来像手套一样适合您的示例。