我有一个基础抽象类
Function
和子类 ExpFunction
、LogFunction
和 CubicFunction
。我有如下主课:
class Main:
"""
Main class to run the program
"""
def __init__(self):
self.f_1 = ExpFunction("Exponential", 0.0, 1.0, 3.0, -5.0, 0)
self.f_2 = LogFunction("Logarithmic", 0.0001, 0.05, 3.0, 10.0, 0.001)
self.f_3 = CubicFunction("f3", 1.0, 2.0, 2.0, -3.0, 4.0, -5.0, 0.0001)
def _run(self):
"""
Run the program
"""
print("Starting the program...\n\n")
self.f_1.print_function()
self.f_1.find_roots()
self.f_2.print_function()
self.f_2.find_roots()
self.f_3.print_function()
self.f_3.find_roots()
print("Program finished.")
def __call__(self, *args, **kwds):
self._run()
if __name__ == "__main__":
main = Main()
main()
这是正确的图表吗?
我们不能说
Function
和它的3个特化是否正确,因为我们没有相应的代码。但是如果它是抽象的,它应该在图中显示(斜体类名),并且您在 3 个专业化中的每一个中都明确定义的抽象操作(也称为 python 中的成员函数)也应该如此显示。
在您的代码片段中,
Main
有 f_1
、f_2
和 f_3
。你的图表说这些总是LogFunction
,ExpFunction
和CubicFunction
。
考虑到当前的代码,这并没有错。
但是,没有什么能阻止您将
f_1
、f_2
和 f_3
更改为其他类型的 Function
,或者以不同的方式初始化它们,因为 您只使用它们的公共抽象接口。所以你也可以显示 Main
与 3 Function
相关联,并将其留给运行时来决定实例化哪个函数。这也是正确的,并且最好使用抽象类允许的抽象和多态性。
由于您的代码没有给出 type 提示,并且由于 python 是动态类型的,我们无法判断这两种替代设计中哪一种是正确的。只有你知道你打算做什么。
顺便说一句,随意删除共享聚合(空心菱形):UML 没有为共享聚合定义任何语义(20 多年以来!):一个简单的关联将表达完全相同的东西。