The initializer pattern is used to assure that the object is properly initialized by its superclass before the init method performs its initialization.
These changes prevent subclasses from relying on implementation details of superclasses and allow subclasses to expose only those superclass methods that are applicable to themselves.