Skip to content

Instantly share code, notes, and snippets.

@ValerioSevilla
Last active January 2, 2018 12:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ValerioSevilla/529b1f9aa17d7c3cdb63e363c9dcbc58 to your computer and use it in GitHub Desktop.
Save ValerioSevilla/529b1f9aa17d7c3cdb63e363c9dcbc58 to your computer and use it in GitHub Desktop.
Simple demonstration of how polymorphism through method overriding and hiding works in C#
using System;
namespace PolymorphismDemo
{
public class A
{
public virtual void Foo() => Console.WriteLine("A.Foo()");
}
public class B : A
{
public new void Foo() => Console.WriteLine("B.Foo()"); // Static binding (hiding)
}
public class C : A
{
public override void Foo() => Console.WriteLine("C.Foo()"); // Dynamic binding (overriding)
}
/*public class D : A // WARNING: new or override required
{
public void Foo() => Console.WriteLine("D.Foo()");
}*/
public class E : C
{
public sealed override void Foo() => Console.WriteLine("E.Foo()"); // C.Foo() is implicitly virtual
}
/*public class F : E // ERROR: sealed method cannot be overridden
{
public override void Foo() => Console.WriteLine("F.Foo()");
}*/
public class G : E
{
public new void Foo() => Console.WriteLine("G.Foo()"); // ... but it can be hidden
}
class MethodOverridingDemo
{
static void Main(string[] args)
{
A thing = new A();
B thing2 = new B();
C thing3 = new C();
A thing4 = thing2;
A thing5 = thing3;
A thing6 = new E();
A thing7 = new G();
thing.Foo(); // A.Foo()
thing2.Foo(); // B.Foo()
thing3.Foo(); // C.Foo()
thing4.Foo(); // A.Foo()
thing5.Foo(); // C.Foo()
thing6.Foo(); // E.Foo()
thing7.Foo(); // E.Foo()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment