In Swift, there are three basic ways to change at runtime what actual method is going to be run when you call a method. 1. Inheritance and Method Overriding if Class B inherits from Class A, then B has everything that A has, including data and methods. Class B can add new data and methods, but it can also override methods that it inherited from A. If an A pointer points to an object and calls that method, if the object happens to be an A object it will run A's method. If it happens to be a B object it runs B's method. 2. Selectors. You can specify an action for a button (or in contexts, too) that will occur whenever the button is clicked. You're allowed to name a method as a parameter to another method. And then when the other method wants to call a method, it calls the one you passed into it. 3. Delegates. Some data structures in the Swift library come with "delegates". And you can define the methods in the delegate itself more or less. The data structure will contain a pointer that you can to the delegate, and then a certain method in the delegate is run, the pointer to the delegate is followed and the method in the delegate is then run (and this may be a method you wrote yourself). In Swift (and in other languages), a class can inherit from ONE other class and from as many delegates as it wants to. A delegate contains no data. It contains methods, but the methods contain no code. When a class inherits from a delegate, it must provide the code for all the methods it inherits from that delegate. In Java, "delegates" are called "interfaces." In C++, the concept of "delegate" does not exist. A class can inherit from as many other classes as it wants to.