UML/OOP: 在不同 类 中使用类似方法的接口
UML/OOP: Using an interface for similar methods in different classes
假设我有两个不同的 classes 需要打印不同的东西:
OrderManager 想要打印订单历史记录,而 MenuManager 想要打印菜单。由于两者都想做类似的功能(但实际实现不同),是否建议使用这样的接口?问题是与“printOrderHistory”相比,函数“print”的定义不是很明确且不言自明,我只能使用接口中定义的确切名称来实现该方法。
是否有解决方法,或者我是否错误地使用了界面概念?事实上,似乎没有什么能阻止我为每个没有接口的 class 定义自己的打印函数...
这就是接口的用途!它定义了一组操作,任何实现了这个接口的class都需要实现这些操作。这允许引用 Printable
对象并调用 print()
,知道它将执行与该对象相关的操作。
因此,您的 UML 图是模棱两可的:正如 OrderManager
意识到(在 java、“实现”中)Printable
它应该有自己的 print()
。 UML和Java中有三种解决方案:
按照您的图表所承诺的界面,将 printOrderHistory()
重命名为 print()
。如果只有一种有意义的方式来打印和订购管理器,并且没有其他限制,这是有意义的。
将 print()
操作(在 java,“方法”中)添加到 OrderManager()
,它只是将调用转发到 printOrderHistory()
。但这看起来过于复杂。仅当订单管理器真的可以打印时才合理,并且 print()
会添加一些相关功能,例如根据某些因素选择正确的打印功能。
使用 adapter pattern 并保持 OrderManager
干净,使用中间对象处理脏东西。如果 OrderManager
的打印函数的名称受到限制,或者如果有不同的打印函数用于不同的目的,这尤其有意义。这是最灵活的方法
这里是解决方案 3 的可能图表:
接口的想法是有一个合同来完成。这意味着,在构建实现时,您必须使用接口中定义的方法名称和参数。
根据我的个人经验,在 类 上强加一个接口总是一个坏主意,它们并不相似,因为它们确实有不同的用途。虽然您可以在 类 中使用 print(),但只有当它们在您的代码中可交换时才有意义。
假设我有两个不同的 classes 需要打印不同的东西:
OrderManager 想要打印订单历史记录,而 MenuManager 想要打印菜单。由于两者都想做类似的功能(但实际实现不同),是否建议使用这样的接口?问题是与“printOrderHistory”相比,函数“print”的定义不是很明确且不言自明,我只能使用接口中定义的确切名称来实现该方法。
是否有解决方法,或者我是否错误地使用了界面概念?事实上,似乎没有什么能阻止我为每个没有接口的 class 定义自己的打印函数...
这就是接口的用途!它定义了一组操作,任何实现了这个接口的class都需要实现这些操作。这允许引用 Printable
对象并调用 print()
,知道它将执行与该对象相关的操作。
因此,您的 UML 图是模棱两可的:正如 OrderManager
意识到(在 java、“实现”中)Printable
它应该有自己的 print()
。 UML和Java中有三种解决方案:
按照您的图表所承诺的界面,将
printOrderHistory()
重命名为print()
。如果只有一种有意义的方式来打印和订购管理器,并且没有其他限制,这是有意义的。将
print()
操作(在 java,“方法”中)添加到OrderManager()
,它只是将调用转发到printOrderHistory()
。但这看起来过于复杂。仅当订单管理器真的可以打印时才合理,并且print()
会添加一些相关功能,例如根据某些因素选择正确的打印功能。使用 adapter pattern 并保持
OrderManager
干净,使用中间对象处理脏东西。如果OrderManager
的打印函数的名称受到限制,或者如果有不同的打印函数用于不同的目的,这尤其有意义。这是最灵活的方法
这里是解决方案 3 的可能图表:
接口的想法是有一个合同来完成。这意味着,在构建实现时,您必须使用接口中定义的方法名称和参数。
根据我的个人经验,在 类 上强加一个接口总是一个坏主意,它们并不相似,因为它们确实有不同的用途。虽然您可以在 类 中使用 print(),但只有当它们在您的代码中可交换时才有意义。