Abstract vs Virtual vs Override vs New Keyword
The virtual keyword is used for the base class function and override keyword in the derived class function to implement function/method overriding.
// Base Class class A { public virtual void show() { Console.WriteLine("Hello: Base Class!"); Console.ReadLine(); } }
The override keyword is used in the derived class function in order to override the base class function:
// Base Class class A { public virtual void show() { Console.WriteLine("Hello: Base Class!"); Console.ReadLine(); } } // Derived Class class B : A { public override void show() { Console.WriteLine("Hello: Derived Class!"); Console.ReadLine(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Generics { class A { public virtual void show() { Console.WriteLine("Hello: Base Class!"); Console.ReadLine(); } } class B : A { public override void show() { Console.WriteLine("Hello: Derived Class!"); Console.ReadLine(); } } class Polymorphism { public static void Main() { A a1 = new A(); a1.show(); B b1 = new B(); b1.show(); A a2 = new B(); a2.show(); } } }
Output:
Hello: Base Class!
Hello: Derived Class!
Hello: Derived Class!
Using the "new" keyword, we can hide the base class member.
It is implemented as:
class A { public void show() { Console.WriteLine("Hello: Base Class!"); Console.ReadLine(); } } class B : A { public new void show() { Console.WriteLine("Hello: Derived Class!"); Console.ReadLine(); } } class Polymorphism { public static void Main() { A a1 = new A(); a1.show(); B b1 = new B(); b1.show(); A a2 = new B(); a2.show(); } }
Output:
Hello: Base Class!
Hello: Derived Class!
Hello: Base Class!
public abstract class A { // Class members here. }
public abstract class A { public abstract void DoWork(int i); }
// compile with: -target:library public class D { public virtual void DoWork(int i) { // Original implementation. } } public abstract class E : D { public abstract override void DoWork(int i); } public class F : E { public override void DoWork(int i) { // New implementation. } }
Classes can be declared as sealed by putting the keyword sealed before the class definition. For example:
public sealed class D { // Class members here. }
A sealed class cannot be used as a base class. For this reason, it cannot also be an abstract class. Sealed classes prevent derivation. Because they can never be used as a base class, some run-time optimizations can make calling sealed class members slightly faster.
A method, indexer, property, or event, on a derived class that is overriding a virtual member of the base class can declare that member as sealed. This negates the virtual aspect of the member for any further derived class. This is accomplished by putting the sealed keyword before the override keyword in the class member declaration. For example:
public class D : C { public sealed override void DoWork() { } }