# C# POLYMORPHISM (METHOD OVERRIDING / OVERLOADING )

**Polymorphism** :
Polymorphism" is the combination of "poly" + "morphs" which means many forms. 
        
Types of polymorphism :
1.compile time polymorphism ,
2.runtime polymorphism

**1.Compile time polymorphism : **

- 
Defining multiple methods with the same name with different parameters. 

```
using System;
	public class SampleClass {
        public void ADD(int x, int y) {
            Console.WriteLine("x + y = {0}", x + y);
        }
        public void ADD(int x, double y) {
            Console.WriteLine("x + y = {0}", x + y);
        }
		public void ADD(int x, int y, int z) {
            Console.WriteLine("x + y + z = {0}", x + y + z);
        }
    }
   	public class Program {
       	public static void Main(string[] args) {
            SampleClass myobj = new SampleClass();
            myobj.ADD(1, 2);
            myobj.ADD(1, 0.3);
			myobj.ADD(1, 2, 3);
        }
    }

o/p: 
==========
x + y = 3
x + y = 1.3
x + y + z = 6
```
**2.Runtime polymorphism :** 
- 
overriding a base class method in the derived class.


```
	using System;
	public class BaseClass {
        public virtual void Method() {
            Console.WriteLine("Base Class");
        }
    }
	public class DerivedClass : BaseClass {
        public override void Method() {
            Console.WriteLine("Derived Class");
        }
    }
	public class DerivedClasstwo : BaseClass {
        public override void Method() {
            Console.WriteLine("Derived Class Two");
        }
    }
   	public class Program {
       	public static void Main(string[] args) {
			
			DerivedClasstwo myobj = new DerivedClasstwo();
            myobj.Method();
			
            DerivedClass myobj1 = new DerivedClass();
            myobj1.Method();
						
			BaseClass myobj2 = new BaseClass();
            myobj2.Method();
        }
    }

o/p: 
==========
Derived Class Two
Derived Class
Base Class
``` 

**Method Overloading :**

- 
we can create two or more Methods having same name but different types or diff no of parameter.


```
	using System;
	public class SampleClass {
        public void ADD(int x, int y) {
            Console.WriteLine("x + y = {0}", x + y);
        }
        public void ADD(int x, double y) {
            Console.WriteLine("x + y = {0}", x + y);
        }
		public void ADD(int x, int y, int z) {
            Console.WriteLine("x + y + z = {0}", x + y + z);
        }
    }
   	public class Program {
       	public static void Main(string[] args) {
            SampleClass myobj = new SampleClass();
            myobj.ADD(1, 2);
            myobj.ADD(1, 0.3);
			myobj.ADD(1, 2, 3);
        }
    }


o/p: 
==========
x + y = 3
x + y = 1.3
x + y + z = 6
``` 

**Method Overriding :
**
- 
If  base class, derived class has same method and perform a different task. 

- 
we need to use override keyword in derived class  & virtual keyword in base class.


```
	using System;
	public class BaseClass {
        public virtual void Method() {
            Console.WriteLine("Base Class");
        }
    }
	public class DerivedClass : BaseClass {
        public override void Method() {
            Console.WriteLine("Derived Class");
        }
    }
	public class DerivedClasstwo : BaseClass {
        public override void Method() {
            Console.WriteLine("Derived Class Two");
        }
    }
   	public class Program {
       	public static void Main(string[] args) {
			
			DerivedClasstwo myobj = new DerivedClasstwo();
            myobj.Method();
			
            DerivedClass myobj1 = new DerivedClass();
            myobj1.Method();
						
			BaseClass myobj2 = new BaseClass();
            myobj2.Method();
        }
    }

o/p: 
==========
Derived Class Two
Derived Class
Base Class
``` 

