Search code examples
c#inheritancevirtualoverridingsubclass

C# calling overridden subclass methods without knowledge that it's a subclass instance


I have a base class with a virtual method, and multiple subclasses that override that method.

When I encounter one of those subclasses, I would like to call the overridden method, but without knowledge of the subclass. I can think of ugly ways to do this (check a value and cast it), but it seems like there should be an in-language way to do it. I want the List to contain multiple subclasses within the same list, otherwise obviously I could just make a List.

EDIT: Fixed the comment in the code that was wrong, which lead to the very appropriate first answer I got :)

For instance:

Class Foo 
{
    public virtual printMe()
    {
        Console.Writeline("FOO");
    }
}

Class Bar : Foo 
{
    public override printMe()
    {
        Console.Writeline("BAR");
    }
}

List<Foo> list = new List<Foo>();
// then populate this list with various 'Bar' and other overriden Foos

foreach (Foo foo in list) 
{
    foo.printMe(); // prints FOO.. Would like it to print BAR
} 

Solution

  • class Foo 
    {
        public virtual void virtualPrintMe()
        {
            nonVirtualPrintMe();
        }
    
        public void nonVirtualPrintMe()
        {
            Console.Writeline("FOO");
        }
    }
    
    class Bar : Foo 
    {
        public override void virtualPrintMe()
        {
            Console.Writeline("BAR");
        }
    }
    
    List<Foo> list = new List<Foo>();
    // then populate this list with various 'Bar' and other overriden Foos
    
    foreach (Foo foo in list) 
    {
        foo.virtualPrintMe(); // prints BAR or FOO
        foo.nonVirtualPrintMe(); // always prints FOO
    }