我想知道公共(public)墙(位于相邻房间)和房间之间的关系。
据我所知,房间与其墙壁之间的关系是 Composition not Aggregation
(我说的对吗?)
并且根据定义
Composition 所包含的对象不能在两个
容器之间共享,而在
code> 聚合 这是可能的
。
现在我很困惑,什么是表示公共(public)墙和旁边房间之间关系的最佳建模方法?
如果您能提供一些代码建议,我们将不胜感激。
|--------|--------|
方法 1:
(wall class ---- room class) /Composition
方法 2:
wall class ----- room class /Aggregation
方法 3:
我们有一个墙类和一个普通墙类,普通墙类继承自墙类
adjoining room class ---- (1) Common wall class /Aggregation
adjoining room class ---- (6) wall class / composition
方法 4: 我是开发人员而不是设计师 :) 所以这是我的想法:
class Room
{
private wall _firstwall ;
private wall _secondtwall;
private wall _thirdwall ;
private wall _commonwall ;
public Room( CommonWall commonwall)
{
_firstwall=new Wall();
_secondtwall=new Wall();
_thirdwall=new Wall();
_commonwall=commonwall;
}
}
Class CommonWall:Wall
{
//...
}
//在某个地方:
static void main()
{
Wall _commonWall=new Wall();
Room room1=new Room(_commonWall);
Room room2=new Room(_commonWall);
Room [] adjacentRoom =new Room[2]{room1,room2};
}
编辑 1:我认为这是一个明确的问题,但只是为了进一步说明:
问题的重点是找出为同时属于两个其他对象的对象的关系建模的最佳模式或方法是什么。
关于我的例子:我说的“房间”是什么意思?当然,我指的是一个封闭的方形房间,有 4 面墙和一扇门。但在这种情况下,其中一堵墙是公共(public)墙,由两个相邻的墙共享房间。
最佳答案
关于房间和墙的问题的答案就是这个问题的答案:“墙可以没有房间吗?”
我相信您的方案正在使用聚合。没有房间,墙还能存在吗?当然可以。一个人可以通过摧毁三堵墙来摧毁这个房间,但剩下的那堵墙是独立存在的。我认为我们现在已经到了语义层面。这个答案可能会根据您在您的场景中查看墙壁的方式而改变。
这link展示了一种简洁的思考方式:
- A“拥有”B = 组合:没有A,B在系统中没有任何意义或目的
- A“使用”B = 聚合:B 独立于(概念上)存在于 A
同here :
聚合 表示子项可以独立于父项存在的关系。示例:类(class)( parent )和学生( child )。删除类(class),学生仍然存在。
组合 表示 child 不能独立于 parent 而存在的关系。示例:房子( parent )和房间( child )。房间不是独立于房子而存在的
来自 wikipedia :
聚合 不同于普通的组合,因为它并不暗示所有权。在组合中,当拥有的对象被销毁时,包含的对象也被销毁。在聚合中,这不一定是正确的。例如,一所大学拥有多个系(例如,化学),每个系都有一些教授。如果大学关闭,院系将不复存在,但院系的教授将继续存在。因此,一所大学可以看作是系的组合,而系则是教授的集合。此外,一名教授可以在多个部门工作,但一个部门不能属于多个大学。
关于c# - 一堵公共(public)墙和旁边的房间之间有什么样的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11236215/