Введение в перегрузку и переопределение в C #

Полиморфизм является одним из важных понятий в C #. Существует два типа полиморфизма: время компиляции и время выполнения. Концепции перегрузки и переопределения используются для достижения этого соответственно. При переопределении дочерний класс может реализовывать метод родительского класса другим способом, но метод дочернего класса имеет то же имя и ту же сигнатуру метода, что и родительский, тогда как при перегрузке в классе есть несколько методов с одним и тем же именем и разными параметрами.

Как перегрузка и перегрузка работает в C #?

Работа переопределения и перегрузки в C # объясняется ниже на примерах:

Переопределение

Есть некоторые ключевые слова, которые мы используем при переопределении, такие как virtual, override и base.

Синтаксис:

class Parent
(
public virtual void Example() // base class
(
Console.WriteLine(“ parent class”);
)
)
class Child: Parent
(
public override void Example() // derived class
(
base.Example();
Console.WriteLine(“Child class”);
)
)

В этом случае используются ключевые слова virtual и override, что означает, что базовый класс является виртуальным, и дочерний класс может реализовать этот класс, а переопределение означает, что этот дочерний класс имеет то же имя и ту же сигнатуру метода, что и родительский класс.

Пример № 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverridingExample
(
class Subject // base class
(
public virtual void study() // base class method
(
Console.WriteLine("Study all the subjects");
)
)
class Mathematics: Subject // derived class
(
public override void study() // derived class method
(
Console.WriteLine("Study Mathematics");
)
)
class Program
(
// main method
static void Main(string() args)
(
Subject s = new Mathematics();
s.study();
Console.ReadLine();
)
)
)

В приведенном выше примере имена методов совпадают, но их реализация отличается. Базовый класс имеет виртуальный и благодаря этому дочерний класс может реализовывать метод родительского класса по-своему. У метода дочернего класса есть ключевое слово override, которое показывает, что этот метод является методом переопределения.

Выход:

Пример № 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverridingExample
(
class Subject // base class
(
public virtual void study() // base class method
(
Console.WriteLine("Study all the subjects");
)
)
class Mathematics: Subject // derived class
(
public override void study() // derived class method
(
base.study();
Console.WriteLine("Study Mathematics");
)
)
class Program
(
// main method
static void Main(string() args)
(
Mathematics m = new Mathematics();
m.study();
Console.ReadLine();
)
)
)

Выход:

В этом примере у производного класса есть ключевое слово base, которое используется для вызова метода базового класса. Таким образом, в этом случае производный метод вызывается после метода базового класса.

Очки для запоминания:

  • В переопределяющей концепции имя метода и сигнатуры метода и модификатор доступа всегда совпадают с родительским и дочерним классом.
  • Метод родительского класса не может быть статическим.

перегрузка

В перегрузке есть несколько методов с разными сигнатурами методов. Ниже приведены некоторые примеры, которые показывают, как мы можем добиться перегрузки путем изменения количества параметров, порядка параметров и типов данных параметров.

Пример № 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
(
class Demo
(
public int Sum(int x, int y)
(
int value = x + y;
return value;
)
public int Sum(int x, int y, int z)
(
int value = x + y + z;
return value;
)
public static void Main(string() args) // main method
(
Demo d = new Demo();
int sum1 = d.Sum(24, 28);
Console.WriteLine("sum of the two "
+ "integer value : " + sum1);
int sum2 = d.Sum(10, 20, 30);
Console.WriteLine("sum of the three "
+ "integer value : " + sum2);
Console.ReadLine();
)
)
)

В приведенном выше примере есть два метода с одинаковым именем, но с разным количеством параметров. Первый метод состоит из двух параметров, а второй имеет три параметра. Это называется перегрузкой метода.

Выход:

Пример № 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
(
class Demo
(
public int Sum(int x, int y, int z)
(
int value = x + y + z;
return value;
)
public double Sum(double x, double y, double z)
(
double value = x + y + z;
return value;
)
public static void Main(string() args) // main method
(
Demo d = new Demo();
int sum1 = d.Sum(24, 28, 7);
Console.WriteLine("sum of the two "
+ "integer value : " + sum1);
double sum2 = d.Sum(10.0, 20.0, 30.0);
Console.WriteLine("sum of the three "
+ "integer value : " + sum2);
Console.ReadLine();
)
)
)

В приведенном выше примере есть два метода с одинаковыми именами, но их типы данных разные. Первый метод имеет целочисленный тип данных, а второй - двойной тип данных. Так что в этом случае параметры меняются из-за разного типа данных.

Выход:

Пример № 3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
(
class Demo
(
public void Details(String name, int id)
(
Console.WriteLine("Name " + name + ", "
+ "Id " + id); ;
)
public void Details(int id, string name)
(
Console.WriteLine("Name " + name + ", "
+ "Id " + id);
)
public static void Main(string() args) // main method
(
Demo d = new Demo();
d.Details("John", 10);
d.Details("Joe", 20);
Console.ReadLine();
)
)
)

В приведенном выше примере имена методов одинаковы, но порядок параметров различен. Первый метод имеет имя и идентификатор соответственно тогда как второй имеет идентификатор и имя соответственно.

Выход:

Очки для запоминания:

  • В концепции перегрузки невозможно определить более одного метода с одинаковыми параметрами в случае порядка, типа и числа.
  • Невозможно перегрузить метод, основанный на различных типах возвращаемых данных.

Преимущества перегрузки и переопределения в C #

  • Перегрузка является одним из способов достижения статичности, а переопределение - одним из способов достижения динамического полиморфизма в C #.
  • Это обеспечивает гибкость для пользователя и чистоту кода.

Вывод

Перегрузка и переопределение играют главную роль в достижении полиморфизма. Переопределение позволяет производному классу реализовываться по-своему, а с другой стороны перегрузка - это методы с одинаковым именем и различными типами реализаций параметров.

Рекомендуемые статьи

Это руководство по перегрузке и переопределению в C #. Здесь мы обсудим работу, синтаксис, преимущества перегрузки и переопределения в C # с примерами и реализацией кода. Вы также можете посмотреть следующие статьи, чтобы узнать больше -

  1. Объекты в C #
  2. 2D массивы в C #
  3. Переопределение в C #
  4. Обмен в C #
  5. Полиморфизм в Яве
  6. 2D-графика в Java
  7. 3 различных типа массивов в PHP (примеры)