UML 中的接口、继承和泛型 Class 图

Interfaces, inheritance and Genrics in UML Class Diagram

我正在基于 DAO 模式对持久层建模,我对 Genrics 和接口继承的使用有一些疑问。

我会说基本的 CRUD 操作对于所有持久实体都是相同的,所以我决定使用泛型提供一个基本的 DAO 接口。然后会有其他继承基本契约的接口加上一些其他与具体实现管理的实体相关的特定方法。

这听起来可能很复杂,但实际上很简单。在 Java 中会是这样的:

public interface BasicDao<T> {

    public T insert(T dataObject);

    public T update(T dataObject);

    public Boolean delete(T dataObject);

    public T getUnique(BigInteger dataObjectId);

    public List<T> getAll();
}

public interface IModulesDao extends IBasicDao<IModule> {

    public IModule getModuleByCode(String code);
}

如你所见IModulesDao在基础契约上增加了一个单一的方法,但具体的实现还是要满足整个契约,这就是做这一切的想法。

现在我已经阅读了UML Class Diagram and Generics about how to model Generics in UML and also this example。据说使用 buond 元素与子类型不同,我们不允许向合同添加任何内容。据我所知,我必须创建中间类型才能最终获得我的 IModulesDao 接口。

这在概念上听起来是正确的,但我不确定是否适合我的情况,因为 IModulesDao 只是 IBasicDao 的扩展或子接口,没有任何中间子类型继承自。恕我直言,它只会给图表添加噪音而没有任何好处。

这是我现在所拥有的,但我认为并不完全正确:

关于如何为这个案例建模,你能指导我正确的方向吗?

您可以在不添加新函数的情况下使用 IModulesDao,因此只需绑定泛型即可。所以它应该被命名为类似于你的 List<T> 作为 IBasicDao<T>。然后使用这个绑定 class 你可以创建一个实际添加新方法的特化,你可以调用那个特化 class IModulesDao.

但老实说,没有人比教皇更虔诚。 UML 为您提供了相当大的自由度,如果 reader 可以理解它,那么它很好。话虽如此,您也可以按照自己的方式生活得很好。