Source: https://www.cs.unibo.it/~nuzzoles/courses/sw-applications/slides/6_OOP_part2.pdf