This document discusses object-oriented design principles regarding inheritance versus delegation for polymorphism. It covers key observations on how inheritance and delegation can both provide polymorphism. It also discusses different types of polymorphism including overloading, generics, and subtyping. The document provides examples of overloaded functions and how static versus dynamic binding works. It concludes with discussions on binding design choices in different programming languages.