OOP Principles: Composition vs Inheritance