【发布时间】:2013-07-30 03:36:22
【问题描述】:
我有 2 个 UML 类,它们被命名为所有者,然后是车辆。
我想知道我是否可以声明该车辆“概括”所有者,因为我希望对象车辆继承分配给所有者的属性。这似乎不对,因为我不会将车辆视为所有者的子类或子类型,但看到我是 UML 新手,我不是专家。
【问题讨论】:
标签: uml
我有 2 个 UML 类,它们被命名为所有者,然后是车辆。
我想知道我是否可以声明该车辆“概括”所有者,因为我希望对象车辆继承分配给所有者的属性。这似乎不对,因为我不会将车辆视为所有者的子类或子类型,但看到我是 UML 新手,我不是专家。
【问题讨论】:
标签: uml
您说,“车辆‘概括’所有者”,然后说,“我希望对象车辆继承分配给所有者的属性。”这两个陈述是矛盾的,因为超类泛化而子类特化。由于您希望 Vehicle 从 Owner 继承属性,因此我假设您在询问是否可以声明 Owner 概括 Vehicle(并且 Vehicle specializes Owner)。
在现实世界中,不是每辆车始终是一种所有者的真实陈述。您的汽车拥有什么?你的意思是它“拥有”它的引擎、车轮和车门吗?这与“拥有”汽车或房屋的概念相同吗?
类的目的不仅仅是代表可重用属性和方法的桶,它们似乎可以节省一些编码时间——尽管许多程序员都是这样对待它们的。它们被称为类,因为它们代表问题域(即“现实世界”)中事物的类。这就是许多程序员误入歧途的地方——他们专注于解决方案领域中的事情,这些事情变化得更快,他们失去了面向对象的所有好处。 OOA/OOP 的关键原则之一是问题域不经常更改,因此它为构建软件提供了一个相对稳定的基础。如果你声称奇怪的东西,例如“车辆总是一种所有者”,你建立在不稳定的沙子上,当你发现一个不再那么方便的情况时,你可能会花费大量时间来逆流而上。 车辆以何种方式始终为车主?许多面向业务的主题专家会同意您的观点吗?
【讨论】:
AssetOwner 角色的Person 和扮演Asset 角色的Vehicle 建模。然后,您可以将它们与关联联系起来。 (从英文语句开始,例如“一个Asset 由一个AssetOwner 拥有/一个AssetOwner 拥有任意数量的Assets。)在这个小小的评论框中很难向你展示。我建议你从Leon 开始Starr 的优秀文章,Articulate Class Models,其中有很多很好的例子。
您可以使用通用抽象类来重新组合通用属性。假设您希望 Owner 和 Vehicle 共享一个共同的 name 属性。您可以使用以下模型。
UML common attributes http://app.genmymodel.com/engine/xaelis/commonAttributes.jpg
【讨论】: