Source: http://www.cs.unibo.it/~nuzzoles/courses/sw-applications/slides/7_OOP_part3.pdf