Class 课堂设计&x2014;相关类之间的循环引用
我需要帮助来找出我的课程的正确设计 我有一个用户类:Class 课堂设计&x2014;相关类之间的循环引用,class,Class,我需要帮助来找出我的课程的正确设计 我有一个用户类: class AppUser: _email - String _fullname - String _organizations - List of ???? _active - Boolean ------------------ getOrgs - Method 此外,我还有一门组织课程: class Organization: _name - String _domain
class AppUser:
_email - String
_fullname - String
_organizations - List of ????
_active - Boolean
------------------
getOrgs - Method
此外,我还有一门组织课程:
class Organization:
_name - String
_domain - String
_members - List of ????
------------------
getMembers
所以,我的问题是名单。Org类有一个_成员列表。此列表可能是AppUser对象的列表。AppUser类有一个组织列表。此列表可能是组织对象的列表
但这将创建一个循环引用
那么,我应该如何实现这一点呢
编辑:
需要使用Python实现这一点。我将查看多对多关系和第三表单规范化我将查看多对多关系和第三表单规范化您没有指定使用哪种语言。这一点很重要,因为在某些语言中,循环引用确实会导致问题(VB6),而在其他语言中则不会(Java、C#等)。在大多数情况下,您可以在类层次结构中使用循环引用,特别是当您使用的是使用垃圾收集进行内存管理的现代语言时。您没有指定使用的是哪种语言。这一点很重要,因为在某些语言中,循环引用确实会导致问题(VB6),而在其他语言中则不会(Java、C#等)。在大多数情况下,您可以在类层次结构中使用循环引用,尤其是在使用垃圾收集进行内存管理的现代语言时。这称为多对多关联。您还应该考虑如果需要双向导航性 ,这称为多对多关联。你也应该考虑如果你需要双向导航性 ,我不认为每个类都有你提到的引用的问题——这是多少个域模型与1∶N的关系一起工作。 所以你的班级看起来像这样(C#):
公共类AppUser{
公共字符串电子邮件{get;set;}
公共字符串全名{get;set;}
公共bool活动{get;set;}
公共列表组织{get;set;}//…等等
}
公营班级组织{
公共字符串名称{get;set;}
公共字符串域{get;set;}
公共列表成员{get;set;}/
}
我不认为每个类都有您提到的引用有什么问题-问题在于有多少域模型使用1:n关系
所以你的班级看起来像这样(C#):
公共类AppUser{
公共字符串电子邮件{get;set;}
公共字符串全名{get;set;}
公共bool活动{get;set;}
公共列表组织{get;set;}//…等等
}
公营班级组织{
公共字符串名称{get;set;}
公共字符串域{get;set;}
公共列表成员{get;set;}/
}
一个重要的区别是,在大多数现代语言中,对象列表是按引用的(指针),而不是按值的。这意味着您可以让成员指向组,而组指向成员。如果你把所有东西都当作一个值,那么你确实会有一个循环引用——每个组都会尝试保留其所有成员的副本,这将尝试保留其所有组的副本,等等。一个重要的区别是,在大多数现代语言中,对象列表都是按引用的,不是通过值。这意味着您可以让成员指向组,而组指向成员。如果您将所有内容都视为一个值,那么您确实会有一个循环引用-每个组都会尝试保留其所有成员的自己的副本,这将尝试保留其所有组的自己的副本,等等。为了避免重复,总的来说,我认为集合可能是首选的数据结构
在组织中的成员集中使用AppUser可能是正确的选择
与实体建立双向关系没有什么错,它们只需要一点思考和规划
需要注意的重要一点是,哪个实体控制着这种关系,这样,当您向组织中添加AppUser时,您就不会因为尝试将addOrganization添加到AppUser而陷入无限的添加循环,然后AppUser会尝试将该用户添加到组织中,等等。为了避免重复,我认为集合可能是选择的数据结构 在组织中的成员集中使用AppUser可能是正确的选择 与实体建立双向关系没有什么错,它们只需要一点思考和规划
需要注意的重要一点是,哪个实体控制了关系,这样当您向组织中添加AppUser时,您不会因为尝试将addOrganization添加到AppUser而陷入无限的添加循环,然后AppUser尝试将该用户添加到组织中,等等。。,在一个项目中,C类中的类之间的双向依赖性很好,但是在C或C++中不允许(不使用某些技术…)。@ Apple LoDeD217:在C语言中进行交叉汇编引用实际上是可行的,只要双向依赖性是通过从第三汇编中定义的类型的间接链接完成的。在一个项目中,C类中的类之间的双向依赖性很好,但是在C或C++中不允许(不使用某些技术…)。@ Apple LoDeD217:在C语言中进行交叉汇编引用实际上是可行的,只要双向依赖性是通过从第三汇编中定义的类型的间接链接完成的。
public class AppUser {
public string Email { get; set;}
public string FullName { get; set;}
public bool Active { get; set;}
public List<Organization> Organizations { get; set;} //... and so on
}
public class Organization {
public string Name { get; set;}
public string Domain { get; set;}
public List<AppUser> Members { get; set;} //... and so on
}