面向对象编程中,如果有多对多的关系,应该由哪个对象来维护?

8
我会举例说明这一点:

class Company {

}

class Person {

}

公司个人之间是多对多的关系。一个个人可以属于多个公司,而一个公司也可以拥有多个个人

那么我是否需要创建第三个类:

class CompanyPerson {

}

或者公司应该处理它:
class Company {
    function add_person() {

    }
}

或者也许应该由Person来处理?
class Person {
    function add_to_company() {

    }
}

可能是使用类建模父子关系的重复问题。 - Ian Mercer
4个回答

2
一些随机组合的PersonCompany实例的共同属性可使用“关联类”进行建模。在UML中有一种表示方法,而在可扩展的编程语言中创建这样一个概念并不难。
其思想是,由PersonCompany组成的任意对象对都具有关系,而该关系本身就是一个对象。它既不是Person也不是Company,而是与特定PersonCompany实例之间的连接相关的东西。
那些东西(属性、方法)构成一个类:即Person-Company关联类。
我以前在Lisp中制作过这个工具,在其中使用了一些宏来为给定的类对定义关联类,并使用全局弱哈希表将对象对映射到它们的关联类对象上(这样可以检索给定人员和公司的关联,当这些对象变为垃圾时,该关联将消失)。
使用例如列表或其他关联数据结构很容易实现实际的公司和人员之间的链接。人员对象可以有公司列表,反之亦然。关联类的思想解决了放置人员-公司东西的问题。例如,每个PersonCompany中都有一个角色(假设如此)。我们不能在Person中拥有“role”变量,因为它可以与许多公司相关联。我们当然也不能在公司中拥有“role”,因为它甚至不是一个人员;它与其相关的是具有角色的人员。角色可以放入关联中:问题解决了。

2

这完全取决于您的使用场景。

如果您只需要查找某个公司的员工,请将人员列表存储在公司中;如果您只需要查找某个人所在的公司,则将其存储在个人信息中。

迟早您会发现需要建模实际的“人<-->公司”关系,并创建一个单独的类来表示它。现在,您可以处理添加属性,例如就业开始日期、结束日期等。


0

我认为你不需要第三个类。

想一下ORM(php的Doctrin,java的Hybernate)的作用:

在这种情况下,在数据库层面上,您将有3个表:

公司、用户和公司用户(用户和公司之间的连接表,指出哪个用户属于哪个公司)。

此外,您还可以只使用两个数据库表来映射此情况:

公司、用户,用户中有一个指向公司的引用。因此,基于此引用,您可以说用户所属的公司。

最后,在类设计方面,我认为:

  • 公司类可以持有用户数组(属于该公司的用户列表)
  • 用户类可以持有对公司的引用(用户所属的公司)

0

这取决于使用情况,但通常可以使用引用类部署多对多对象关系

class CompanyPersonRelationship {
    public $company;
    public $person;
}

现在,公司和个人都可以跟踪他们之间的关系了。

class Company {
   public $persons = array();   
}

class Person {
   public $companies = array();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接