Mastering C# Fundamentals: The Is-A Relation

mohamed Tayel - Oct 2 - - Dev Community
What is the "Is-A" Relationship?

The "Is-A" relationship is a way to describe inheritance, where a derived class is a specialized form of its base class. For example, "a rose is a flower" or "an apple is a fruit." In C#, we use inheritance to express this type of relationship in code, making our programs more modular and easier to manage.

Let’s consider a new example with plants:

  • Suppose we have a base class called Plant. A Plant has common properties such as Height and Color, and methods like Grow().
  • We can derive different classes from Plant, such as Flower and Tree. Both Flower and Tree inherit the properties and behaviors from Plant.

When we define an instance of the Flower class, which inherits from Plant, all public and protected members of the Plant class become available to Flower. For example, if Grow() is a method in Plant, it becomes accessible to Flower. This is the essence of the "Is-A" relationship: every Flower is a Plant.

Extending Functionality in Derived Classes

Derived classes can also add new functionality unique to themselves. For example, Flower may have a method called Bloom(), which is not relevant to other plants, such as Tree. On the other hand, Tree may have a method called ShedLeaves() that is not available for Flower. This way, the derived classes (Flower and Tree) inherit common behaviors from Plant but also have their own unique characteristics.

Practical Example: A Hierarchy of Plants

Let’s return to Visual Studio and create some classes that demonstrate this:

public class Plant
{
    public double Height { get; set; }
    public string Color { get; set; }

    public void Grow()
    {
        Console.WriteLine("The plant is growing.");
    }
}

public class Flower : Plant
{
    public void Bloom()
    {
        Console.WriteLine("The flower is blooming.");
    }
}

public class Tree : Plant
{
    public void ShedLeaves()
    {
        Console.WriteLine("The tree is shedding its leaves.");
    }
}
Enter fullscreen mode Exit fullscreen mode

In the code above, Flower and Tree both inherit from Plant, meaning that every Flower and Tree "is a" Plant. Both have the Height and Color properties, as well as the Grow() method. Additionally, Flower has a specific method Bloom(), and Tree has a specific method ShedLeaves().

Working with Derived Types through Base Types

One of the key aspects of the "Is-A" relationship is that derived types can be treated as their base types. For instance, let’s look at how we can use polymorphism with our plant example:

Plant rose = new Flower();
rose.Grow(); // This works because Grow() is defined in Plant

// The line below would cause an error, as Bloom() is specific to Flower
// rose.Bloom(); 

Flower tulip = new Flower();
tulip.Bloom(); // This works because tulip is of type Flower
Enter fullscreen mode Exit fullscreen mode

In the above example, rose is a Plant reference that points to a Flower instance. Therefore, it can access all the members of the Plant class, such as Grow(), but not members that are specific to Flower, such as Bloom(). On the other hand, tulip is declared as a Flower, so it can access both the Grow() and Bloom() methods.

Assignment Levels

To help solidify the concept of inheritance and the "Is-A" relationship, here are assignments at three levels of difficulty:

Easy Level Assignment
  • Task: Create a base class called Book with properties Title and Author, and a method Read().
  • Exercise: Derive two classes, EBook and PrintedBook, from Book. Add a method Download() to EBook and a method FlipPage() to PrintedBook. Demonstrate how each type shares common properties and methods from Book.
Medium Level Assignment
  • Task: Create a base class called Appliance with a method TurnOn().
  • Exercise: Derive two classes, WashingMachine and Refrigerator, from Appliance. Add a method StartWashCycle() to WashingMachine and a method Cool() to Refrigerator. Write a program that treats both WashingMachine and Refrigerator objects as Appliance objects, illustrating which methods are accessible when using the base type.
Difficult Level Assignment
  • Task: Create a base class called Instrument with methods Play() and Tune().
  • Exercise: Derive three classes: Guitar, Piano, and Violin from Instrument. Add specific methods like Strum() for Guitar, PressKeys() for Piano, and Bow() for Violin. Write a program that creates a list of Instrument references, each pointing to different types of instruments. Use polymorphism to iterate through the list and call the Play() method on each object. Try adding a feature where specific methods like Strum() can be accessed only if the reference is of the specific type (Guitar).

Conclusion

The "Is-A" relationship in C# is an important feature brought by inheritance. It allows us to define specific classes that inherit the functionality of more general classes, while also adding their unique features. This relationship is essential to understanding how inheritance works, making our code more reusable, maintainable, and organized. Mastering the use of inheritance helps you write better object-oriented programs and is a valuable tool in every C# developer’s toolbox.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player