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