Polymorphism
Different objects can handle identical
messages with different implementations
Dynamic binding: Run-time association of
a message to an object and one of the
object's operations
Can substitute objects that implement the
same interface at run-time