Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

What is Inheritance in Ruby?

Inheritance is a fundamental concept in object-oriented programming (OOP) languages like Ruby. In this blog post, we'll explore inheritance in Ruby with the goal of providing a clear understanding of the concept for someone who is new to programming. We'll avoid using too much jargon, and when we do introduce new terms, we'll make sure to explain them. This post will also contain code examples and analogies to help you grasp the idea of inheritance more effectively. So let's get started!

What is Inheritance?

Inheritance is a way of reusing code and creating new classes (types of objects) based on existing ones. In Ruby, inheritance allows a class (child class) to inherit (or acquire) the properties and methods of another class (parent class). This helps reduce code duplication and makes it easier to maintain code.

To illustrate the concept of inheritance, let's use an analogy. Think of a family tree where children inherit traits from their parents. For example, a child might inherit their mother's eye color or their father's height. Similarly, in programming, a class can inherit properties and methods from another class.

How Inheritance Works in Ruby

In Ruby, inheritance is achieved by using the < operator followed by the name of the parent class. The syntax for creating a new class that inherits from an existing class is as follows:

class ChildClass < ParentClass
  # code
end

When a child class inherits from a parent class, it gains access to all the properties (variables) and methods (functions) defined in the parent class. The child class can also override (or modify) the parent class's methods to suit its own needs or add new methods and properties.

Let's look at a simple example to demonstrate inheritance in Ruby.

Imagine we're building a program to manage a zoo. We can start by creating a base class called Animal that will hold common properties and methods shared by all animals in the zoo.

class Animal
  def initialize(name, age)
    @name = name
    @age = age
  end

  def speak
    puts "I am an animal."
  end
end

In this example, we have defined an Animal class with an initialize method that takes two arguments, name and age. The initialize method is called when a new object is created, and it sets the instance variables @name and @age. We also have a speak method that outputs a message.

Now let's say we want to create a class for a specific type of animal, like a Dog. We can create a new Dog class that inherits from the Animal class like this:

class Dog < Animal
  def speak
    puts "Woof! I am a dog."
  end
end

In this example, the Dog class inherits from the Animal class. The Dog class doesn't have an initialize method, but it does have a speak method. Since the Dog class inherits from the Animal class, it automatically has access to the initialize method from the Animal class. This means that we can create a new Dog object and set its name and age just like we would with an Animal object.

dog = Dog.new("Buddy", 3)

Here, we create a new Dog object with the name "Buddy" and age 3. Since the Dog class inherits from the Animal class, it can use the initialize method from the Animal class to set the name and age for the new Dog object.

If we call the speak method on the dog object, it will use the speak method from the Dog class rather than the Animal class:

dog.speak
# Output: Woof! I am a dog.

In this case, the speak method in the Dog class overrides the speak method in the Animal class. This is an example of method overriding, which is another key feature of inheritance.

We can also add new methods to the Dog class that are not available in the Animal class. For example, we could add a bark method:

class Dog < Animal
  def speak
    puts "Woof! I am a dog."
  end

  def bark
    puts "Woof! Woof!"
  end
end

Now, the Dog class has a new bark method that is not available in the Animal class:

dog.bark
# Output: Woof! Woof!

The super Keyword

In some cases, you may want to call a method from the parent class while also overriding it in the child class. To do this, you can use the super keyword.

The super keyword is used to call a method with the same name in the parent class. This can be useful when you want to add additional functionality to a method in the child class while still using the original implementation from the parent class.

Here's an example that demonstrates the use of the super keyword:

class Dog < Animal
  def speak
    super
    puts "Woof! I am a dog."
  end
end

dog = Dog.new("Buddy", 3)
dog.speak
# Output:
# I am an animal.
# Woof! I am a dog.

In this example, the speak method in the Dog class calls the speak method from the Animal class using the super keyword. This allows us to include the message "I am an animal." from the Animal class's speak method while adding the message "Woof! I am a dog." from the Dog class's speak method.

Conclusion

Inheritance is a powerful concept in object-oriented programming that allows you to reuse code and create new classes based on existing ones. In Ruby, inheritance is achieved using the < operator, and it enables a child class to inherit properties and methods from a parent class. The child class can also override methods from the parent class or add new methods.

In this blog post, we explored the basics of inheritance in Ruby with examples and analogies to help you understand the concept. We also covered method overriding and the super keyword. Now that you have a better understanding of inheritance, you can apply this knowledge to create more efficient and organized code in your Ruby projects. Happy coding!