C# > Object-Oriented Programming (OOP) > Polymorphism > Dynamic Binding
Dynamic Binding with Virtual Methods in C#
This example demonstrates dynamic binding (also known as late binding) using virtual methods in C#. Dynamic binding allows the specific method implementation to be determined at runtime, based on the actual object type. This snippet showcases how polymorphism, achieved through inheritance and virtual methods, enables flexible and extensible code.
Concepts Behind Dynamic Binding
Dynamic binding
, also known as late binding, means that the method to be called is determined at runtime, not at compile time. This is in contrast to static binding
(or early binding), where the method call is resolved during compilation. In C#, dynamic binding is achieved through virtual methods and method overriding. When a virtual method is called on an object, the runtime checks the actual type of the object (not just the declared type) to determine which method implementation to execute. This allows derived classes to provide specialized behavior for methods inherited from base classes, leading to polymorphism.
Code Example: Virtual Methods and Overriding
In this example, the Animal
class defines a virtual
method called MakeSound()
. The Dog
and Cat
classes inherit from Animal
and override
the MakeSound()
method to provide their specific implementations. When MakeSound()
is called on an Animal
object, the base class implementation is executed. However, when MakeSound()
is called on a Dog
or Cat
object (even when referenced as an Animal
), the overridden implementation in the derived class is executed. This is dynamic binding in action – the specific method called is determined at runtime based on the actual object type. The List example demonstrates how a collection of different animal types can be treated uniformly through the base class Animal
, and each animal will produce its own sound when MakeSound()
is called. This shows a practical use of polymorphism and dynamic binding.
using System;
public class Animal
{
public virtual void MakeSound()
{
Console.WriteLine("Generic animal sound");
}
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof!");
}
}
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Meow!");
}
}
public class Example
{
public static void Main(string[] args)
{
Animal animal1 = new Animal();
Animal animal2 = new Dog(); // Upcasting
Animal animal3 = new Cat(); // Upcasting
animal1.MakeSound(); // Output: Generic animal sound
animal2.MakeSound(); // Output: Woof!
animal3.MakeSound(); // Output: Meow!
//Demonstration with list
List<Animal> animals = new List<Animal>() { new Animal(), new Dog(), new Cat() };
foreach (Animal animal in animals)
{
animal.MakeSound();
}
}
}
Real-Life Use Case
Consider a drawing application where you have different shapes (e.g., Circle, Rectangle, Triangle) inheriting from a base class Shape
. The Shape
class might define a virtual method Draw()
. Each derived class would override the Draw()
method to draw its specific shape. The application could then store a collection of Shape
objects and, when asked to draw them, iterate through the collection and call the Draw()
method on each object. Dynamic binding ensures that the correct drawing logic for each shape is executed, regardless of the declared type of the object.
Best Practices
Interview Tip
Be prepared to explain the difference between static binding and dynamic binding, and how they relate to polymorphism. Explain the use of virtual
and override
keywords in C# and how they enable dynamic binding. Give examples of scenarios where dynamic binding is beneficial.
When to Use Them
Use dynamic binding when you need to design flexible and extensible systems where the behavior of objects can vary based on their actual type. It's particularly useful in scenarios involving inheritance and polymorphism, such as creating plugin architectures or handling different types of data in a uniform way.
Memory footprint
Dynamic binding does not directly increase the memory footprint of individual objects. However, the runtime needs to maintain information about the type hierarchy and virtual method tables (vtables) to support dynamic dispatch. The vtable is a lookup table of functions used to resolve dynamic method calls. Each class with virtual methods will have a vtable, which does contribute to the overall memory usage, but this overhead is usually acceptable considering the flexibility and extensibility benefits of dynamic binding.
Alternatives
Pros
Cons
FAQ
-
What is the difference between virtual and abstract methods?
Avirtual
method has a default implementation in the base class and can be overridden in derived classes. Anabstract
method, on the other hand, has no implementation in the base class and must be implemented in derived classes. An abstract method implicitly declares the class as abstract as well. -
Can I override a method multiple times in different derived classes?
Yes, a virtual method can be overridden in multiple levels of inheritance. Each derived class can provide its own specific implementation. -
What happens if I don't override a virtual method in a derived class?
If a derived class doesn't override a virtual method, it inherits the implementation from its base class. When the method is called on an object of that derived class, the base class's implementation will be executed.