Friday, May 20, 2016

Objective-C Method Overriding

We override methods in Base class in child classes to,

  • Replace/Customize the base class functionality
  • Extend the base class method's functionality

If you need to add allover new functionality to a class, I would like to suggest Categories. Use Method overriding only when you need to replace/extend the base class original functionality.

Please go through my post Objective C Subclass vs Category to get an idea on when to go for Categories and when to go for SubClassing.

Talking about Method overriding, Let's have a look at the basic definition of it first.


                         



Method overriding is a language feature in which a class can provide an implementation of a method that is already provided by one of its parent classes. The implementation in this class replaces (that is, overrides) the implementation in the parent class.

When you define a method with the same name as that of a parent class, that new method replaces the inherited definition. The new method must have the same return type and take the same number and type of parameters as the method you are overriding.

So, as per the definition, With the help of Method overriding feature in OOP, We have an option to extend/replace the base class functionality in a child class as per our requirement.

Let's see an example in Objective-C.



     
@interface Parent : NSObject  

     - (void)thankYou:(NSString*)visitorName;

     @end

     @interface Child : NSObject  

     - (void)thankYou:(NSString*)visitorName;

     @end


Unlike in other programming languages, We don't need to give a prefix 'override' for overridden methods in Objective-C. But the only rule is subclass method should have the same name and property list of base class method for overriding.



     
@implementation Parent

          - (void)thankYou:(NSString*)visitorName{

              NSLog(@"From Parent : Thank you %@", visitorName);
          }

     @end

     @implementation Child

          - (void)thankYou:(NSString*)visitorName{

               NSLog(@"From child : Thank you %@", visitorName);
          }

     @end


In the above example, Whenever there is a visitor, Parent class says thank you when we send a 'thankYou' message to Parent class by calling thankYou method.



     
[parentObj thankYou:@"visitor1"];  // From Parent : Thank you visitor1


In my child class, I need this thankYou method but I want a thank on behalf of my child object. So I need to go for overriding this method as I can write child own logic in the method.



     
[childObj thankYou:@"visitor1"];    // From Child : Thank you visitor1


See, Same functionality but a little customization in the subclass with the help of Method Overriding.

Let's see how can we extend the functionality. I mean I need my Base class method called also first and after that my child class logic. I don't need to replace the functionality of base class. I just need to extend the functionality.

In addition to completely replacing an existing implementation, you might want to extend a superclass's implementation. Here comes the super keyword. Within a method definition, super refers to the parent class of the current object. To call methods in the base class from child class, We can use this super keyword.

For example, I need both my parent and child should thank a visitor but should be properly conveyed.



     
@implementation Child

        - (void)thankYou:(NSString*)visitorName{

             [super thankYou: visitorName];  //calling baseclass method

             NSLog(@"From child : Thank you %@", visitorName);
         }

     @end


If a child object thanks, a visitor gets a thank you from both parent and child. Of course, child is saying on behalf of parent also here. 

Now If you call child object's thank you method,



  [childObj thankYou:@"visitor1"];       //  From Parent : Thank you visitor1

                                                         //  From Child : Thank you visitor1



Hope this post is useful. Feel free to comment in case of any queries.

No comments:

Post a Comment