存在继承关系时如何绘制自反关联?UML类图技术问询
类图绘制疑问解答
先看你给出的示例代码对应的业务逻辑:
class PersonRole{} class Employee{ isA PersonRole; } class Manager { isA Employee; 0..1 -- * Employee; }
自反关联的理解是正确的
自反关联的定义就是同一类的实例之间存在关联关系,比如一个类的实例可以关联到该类的其他实例,这个理解没问题。
不能将Manager和Employee归为PersonRole做自反关联
这么做会丢失关键的业务语义和类结构信息:
- PersonRole是抽象的顶层角色,并非所有PersonRole实例都存在“管理-被管理”的关系,只有Employee体系内才有这个业务规则;
- Manager是Employee的子类,它具备管理普通Employee的专属能力,用PersonRole的自反关联会抹平Manager和普通Employee的角色差异,无法体现“只有Manager能管理Employee”的核心逻辑。
正确的类图画法
应该同时保留泛化关系和特定关联关系:
- 泛化(继承):
- 从
Employee指向PersonRole绘制空心三角箭头,表示Employee是PersonRole的子类; - 从
Manager指向Employee绘制空心三角箭头,表示Manager是Employee的子类;
- 从
- 关联:
- 在
Manager和Employee之间绘制关联线,标注Manager端的多重性为0..1,Employee端的多重性为*,对应示例代码里的0..1 -- * Employee,表示一个Manager可管理多个Employee,一个Employee最多有一个直属Manager。
- 在
关于你尝试的两种画法
- 普通自反连线:这种画法错误地暗示所有Employee都能管理其他Employee,但实际上只有Manager子类拥有这个权限,不符合业务逻辑,所以不合适;
- 第二种保留泛化加Manager-Employee关联的画法:这是完全符合UML规范和业务语义的正确方案,不需要改用自反关联。
内容的提问来源于stack exchange,提问作者AmazingEgg
相关产品推荐
相关产品推荐

