Source: http://www.iro.umontreal.ca/~dufour/cours/ift3912/docs/7-conceptionOO.pdf