我试图了解我应该如何在 UML 中使用接口的实现和抽象类的实现。我在https://stackoverflow.com/a/13438187/700543上看到了帖子,发帖者指出纯虚拟方法是接口,而部分纯虚拟方法是抽象类。有没有人能给我一个真实世界的场景,而不是一个基于代码的场景?
2 回答
接口只是库用户扩展的“类骨架”,正如您所说,方法无法实现。抽象类可以具有实现的方法。我会给你一个现实生活中的例子:
想象一下,我为人们提供了一个接口来实现排序功能,我还提供了一个用于基准排序功能的类。我的基准测试类只需要知道它需要调用接口的哪些方法来执行基准测试,它不知道它们是如何实现的。因此,在基准标记类中,您可能只会看到类似sortInterfaceInstace.getNumberOfSwap()
, 而在编译时sortInterfaceInstance
只知道是sortInterface
类型,而不是任何特定的用户排序实现。
如果您需要实现的方法,请使用抽象而不是接口。
接口只描述了如何使用某些东西,它不提供如何完成的底层实现,即只有纯虚函数的类。界面的英语类比可能是形容词。
接口的一个示例是 Movable 接口。这个接口可以提供一个纯虚函数 move,它告诉对象移动到给定的位置。但是,它如何移动到那里并没有实现。
另一方面,抽象类与接口的不同之处在于它提供了一些实现细节,但不是全部。从概念上讲,这些是可以以某些方式操作的高级项目,但是当您深入了解它时,高级项目本身并不真正存在或没有意义。
例如,假设我们有一个抽象的 Shape 类。形状可以有一个特定的来源,可以独立于它是什么形状进行跟踪。转换形状的函数可以在 Shape 类中声明和实现,省去了在每个子类中提供相同实现的麻烦。但是,当您尝试获取形状的面积或周长时,如果不了解更多关于形状的信息,就很难回答这个问题。