Введение в полиморфизм в C #

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

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

Полиморфизм широко используется для реализации наследования. Объекты, которые имеют различную внутреннюю структуру, могут реализовать общий интерфейс посредством полиморфизма. Следующая диаграмма иллюстрирует работу полиморфизма:

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

Формы полиморфизма

Ниже приведены 2 формы полиморфизма:

1. Перегрузка оператора

Оператор может выдавать различные выходные данные в зависимости от типа операндов, с которыми он работает. Это называется перегрузкой оператора. Например, оператор «+» может выполнять сложение для двух целых чисел, в то время как он может объединять две строки. Таким образом, один и тот же оператор может использоваться двумя различными способами. Оператор сложения обычно добавляет два числа. Однако в случае комплексных чисел сложение немного отличается, когда соответствующие действительные части и мнимые части добавляются отдельно. Вот пример кода, который показывает, как оператор «+» может быть перегружен для добавления комплексных чисел:

Код:

using System;
namespace Overload (
class Complex
(
public double x;
public double y;
// no-argument constructor
public Complex() ()
// parameterized constructor
public Complex(double real, double img)
(
x = real;
y = img;
)
// Overloading of Binary "+" operator
public static Complex operator + (Complex c1,
Complex c2)
(
Complex c3 = new Complex();
c3.x = c1.x + c2.x;
c3.y = c1.y + c2.y;
return c3;
)
// function to display result
public void display()
(
Console.WriteLine("(0) + (1)i", x, y);
)
)
class CalNum (
// Driver Code
static void Main(string() args)
(
Complex num1 = new Complex(2.5, 3.5);
Complex num2 = new Complex(1.2, 6.5);
Complex num3 = num1 + num2;
Console.Write("c1 = ");
num1.display();
Console.Write("c2 = ");
num2.display();
Console.Write("c3 = ");
num3.display();
)
)
)

Выход:

Эти выходные данные иллюстрируют перегрузку оператора для добавления двух комплексных чисел. Код показывает перегрузку операторов, а также перегрузку функций.

2. Перегрузка функций

Функция может выдавать различные выходные данные в зависимости от количества параметров, а также их типов и типа возвращаемых функций. Вышеупомянутый код также охватывает перегрузку функций с помощью конструктора. В коде 2 конструктора; один является конструктором по умолчанию, который остается пустым, в то время как другой является параметризованным конструктором, который используется для инициализации комплексного числа значениями, упомянутыми в качестве параметров.

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

Код:

using System;
using System.Collections.Generic;
public class Clay
(
// A few example members
public int Height ( get; set; )
public int strokeDirection ( get; set; )
// Virtual method
public virtual void Mould()
(
Console.WriteLine("Beginning to mould the clay");
)
)
class Pot : Clay
(
public override void Mould()
(
// Code to make a pot Console.WriteLine("Making a pot");
base.Mould();
)
)
class Bowl : Clay
(
public override void Mould()
(
// Code to make a bowl
Console.WriteLine("Making a bowl");
base.Mould();
)
)
class Toy : Clay
(
public override void Mould()
(
// Code to make a toy
Console.WriteLine("Making a toy");
base.Mould();
)
)
class Program
(
static void Main(string() args)
(
// Illustrating Polymorphism #1: a Pot, Bowl and Toy
// can all be used wherever Clay is expected. No cast is
// needed because an implicit conversion exists from a derived
// class to its base class.
var items = new List
(
new Pot(),
new Bowl(),
new Toy()
);
// Polymorphism at work #2: the virtual method Mould is
// invoked on each of the derived classes, not the base class.
foreach (var item in items)
(
item.Mould();
)
)
)

Выход:

Как вы, возможно, заметили в коде, класс Clay - это родительский класс, чьи дочерние классы - это классы горшок, игрушка и чаша. Метод «Mold» определен в родительском классе, а также в дочернем классе с той же сигнатурой функции. Следовательно, когда объект дочернего класса создается и вызывает метод Mold, метод базового класса переопределяется методом дочернего класса. Таким образом, мы видим вывод метода дочернего класса. Приведенный выше код демонстрирует переопределение и не перегрузку метода для иллюстрации полиморфизма.

Точки, которые следует учитывать при полиморфизме в c #

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

Ниже приведены некоторые ключевые выводы:

  1. Полиморфизм является одной из основных парадигм объектно-ориентированного программирования.
  2. Перегрузка функции изменяет функцию в соответствии с типами возвращаемых данных и параметрами функции в унаследованном классе.
  3. Перегрузка оператора изменяет определение оператора согласно заданным параметрам.
  4. Полиморфизм используется для реализации, он решает во время выполнения вызвать метод дочернего класса, используя переопределение метода.

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

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

  1. Что такое StringBuilder в C #
  2. Копировать конструктор в C #
  3. Что такое многопоточность в C #?
  4. Что такое шаблон проектирования в C #?
  5. Типы конструктора в C # с реализацией кода
  6. Полное руководство по многопоточности в C #