我目前有以下两个实体:
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。您会在任何地方看到此建议,并且看起来像手套一样适合您的示例。

10-08 19:26