如何在UML中标识跨类方法调用?我的代码对应UML表示是否正确?
嗨,作为UML新手能想到把代码对应到UML图已经超棒啦!先直接给你答案:当然可以在UML中标识一个方法调用另一个类的方法~
先把你的代码片段贴出来方便对照:
class Enemy{ int _health; void Attack(){ Player.GetDamage(25); } } class Player{ int _health; public void GetDamage(int amount){ _health -= amount; } }
先插个小插曲:你代码里Player.GetDamage(25)的写法其实有点问题——GetDamage是实例方法(没加static),正常C#里得通过Player的对象实例调用,比如playerInstance.GetDamage(25);如果是想写静态方法,得给GetDamage加static关键字。这个细节会影响UML的表示,下面分两种情况说:
正确的UML类图表示方式
1. 先搞定类的基础结构
不管调用方式如何,两个类的UML结构应该是这样的:
- Enemy类:
- 私有属性:
- _health: int - 私有方法:
- Attack(): void
- 私有属性:
- Player类:
- 私有属性:
- _health: int - 公有方法:
+ GetDamage(amount: int): void(如果是静态方法,要给方法名加下划线:+ _GetDamage(amount: int): void)
- 私有属性:
2. 标记方法调用关系
UML里用依赖关系(虚线箭头)来表示临时的方法调用,具体分两种情况:
情况一:GetDamage是实例方法(代码需要调整为调用Player对象)
这种情况下,Enemy的Attack方法需要依赖Player的实例才能调用GetDamage,UML里要画一条从Enemy指向Player的虚线箭头,箭头旁边可以标注调用信息,比如<<call>> Attack() → GetDamage(25),清晰说明是Enemy的Attack方法调用了Player的GetDamage方法,参数是25。
情况二:GetDamage是静态方法(代码给GetDamage加static)
此时不需要Player实例,直接通过类调用,UML里同样用从Enemy指向Player的虚线箭头,标注调用信息,同时记得给Player的GetDamage方法加下划线(UML里静态成员的标识)。
新手常见踩坑点提醒
- 别搞混访问修饰符的符号:
-代表私有、+代表公有、#代表保护,这是UML的规范写法 - 静态成员(属性/方法)必须加下划线,这是区分静态和实例成员的关键
- 方法调用用虚线依赖箭头,不是实线关联——实线关联表示类之间长期持有引用(比如Enemy里有个Player类型的成员变量),而依赖只是临时调用的关系
内容的提问来源于stack exchange,提问作者blablaalb
相关产品推荐
相关产品推荐

