我的程序有一些抽象的“模块”。 假设它是一个GUI模块。 它只包含模块的接口及其类型 - 为了与其他模块兼容(在另一个模块中,我可以使用GUI模块及其类型,而不用担心它的实现)。
所以我有这样的想法:
GUI::Component //represent the abstract component (button, label etc.)
//so it's only the base class for components
GUI::Clickable //if any component is clickable, it must inherit from it
GUI::Button : public Component, public Clickable
GUI::Label : public Component
但即使是Label
或Button
也只有虚拟方法(我猜它们是模块的接口)。 GUI模块实现例如SomeGUIImp
必须声明SomeButton : public GUI::Button
和SomeLabel : public GUI::Label
(由于对象工厂,它们对用户是透明的。)
我不想更改代码中的任何内容,我只想为其制作一个合适的UML图。
所有元素(Component, Clickable, Button
)都是接口吗?还是抽象类?
我想以某种方式表明,Label
和Button
比Component
更“抽象”(用户可以更直接地使用,更明确)。
此外,最好显示Clickable
(它的功能)和Component
之间的区别(它是所有组件的抽象基础)。
我不能说100%为什么,但在我看来,Clickable
可能是一个接口,Component
是一个抽象类,Button
只是常规类。
但是这显示了模块内部的关系,忽略了Button
(只有纯虚方法)也只是某个模块实现的声明?
答案 0 :(得分:2)
规则非常简单 - 只有纯虚方法的类是接口,部分纯方法的类是抽象类,没有虚方法的类是实现类。如果这不适合您的设计,您可能应该重新考虑一些事情。例如,如果您将Button
视为接口和常规类,则应将其拆分为2个不同的类 - 一个用于接口,另一个用于实现。
答案 1 :(得分:1)
由于C ++没有接口的概念,当一个类是100%抽象(虚拟)时,你可以将它建模为接口或抽象类。在您的描述中,这些类在语义上更接近于接口,因此以这种方式对它们进行建模会很好。你正在采取的方向似乎非常好恕我直言。