问题描述
我正在尝试思考如何理解这个 UML 图并检查如何将其表示为代码:
让我困惑的是,我们在 Company 和 Employee 接口之间存在关联关系,而 Designer 类实现了 Employee 接口,但是我们如何将 Company 与 Employee 接口连接起来?
我的理解(例如 PHP):
class Company {
...
}
class GameDevCompany extends Company {
...
}
class Designer extends GameDevCompany implements Employee {
...
}
如果我像这段代码一样思考这个图表,它是一种真实的方式,还是我遗漏了什么或做错了什么?
谢谢
解决方法
在这张图中,我们有三个概念:
- 专业化:
Company
有两个专业化,分别是GameDev Company
和Outsourcing Company
- 实现:一个接口Employee可以被任何实现这个接口的类实现,比如
Designer
(或Programmer
、Artist
、Tester
、...) - 关联:
Company
与Employee
关联。该图没有说明多重性。但由于这是一个非常简单的模型,而且根据我们的知识,我们可以猜测一个 Company 可能与没有、一个或多个Employee
相关联。
在 PHP 术语中,特化是 inheritance,用 extend
关键字表示:
class Company {
...
}
class GameDevCompany extends Company {
...
}
在 PHP 术语中 interfaces are implemented 而不是实现,这用关键字 implements
表示
interface Employee {
...
}
class Designer implements Employee {
...
}
一个 Company
与潜在的多个 Employee
的关联要求 Company
具有某种 iterable container,例如包含 {{3} } 到 Employee
对象。我的 PHP 很生疏,但我明白 array 这正是普通关联所需要的。
我刚刚重温了我生锈的 PHP 知识,现在我只能说你的代码很好。 extends
是继承(左边是泛化关系),implements
是接口实现(右边是实现关系)。
扩展关于关联的查询:嗯,我的 PHP 非常生锈,但 IIRC 它完全没有类型化。因此,您将有一些对象指针,例如在定义的 $employee
类中的 Company
并且引用已实现 Employee
接口的对象。因此,您可能会在 $employee->doWork()
类实现中执行一些 Company
。可能你不会有一个,而是一个数组。老实说,这对于语法来说真的太久远了。但您可能知道如何编码。
附言因为(如上所述)我的 PHP 非常生锈,所以我不太了解 extends
和 implements
的组合会产生什么。