Wprowadzenie do polimorfizmu w C #
Polimorfizm jest jedną z zasad programowania obiektowego. Poli oznacza wiele, a morfing oznacza transformację, polimorfizm oznacza zatem możliwość przyjmowania wielu form.
Wydajność operatorów różni się w zależności od rodzaju operandów, co jest formą polimorfizmu znanego jako przeciążanie operatora. Tutaj operator może przyjmować wiele formularzy w celu uzyskania różnych wyników. Wyjście funkcji różni się w zależności od różnych typów zwracanych parametrów i parametrów, co jest inną formą polimorfizmu znaną jako przeciążanie funkcji. Tutaj funkcja przyjmuje wiele form, aby wygenerować wiele wyników.
Polimorfizm jest szeroko stosowany do implementacji dziedziczenia. Obiekty o różnej strukturze wewnętrznej mogą implementować wspólny interfejs poprzez polimorfizm. Poniższy schemat ilustruje działanie polimorfizmu:
Ta rycina wyjaśnia, że glina jest obiektem nadrzędnym, z którego wykonane są naczynia, miska i zabawki. Wszystkie te obiekty różnią się od siebie, ale mają właściwości gliny. Te trzy przedmioty mają różne kształty i są używane na różne sposoby, nawet jeśli są wykonane z tego samego materiału gliny.
Formy polimorfizmu
Poniżej znajdują się 2 formy polimorfizmu:
1. Przeciążenie operatora
Operator może podawać różne wyniki w zależności od typu operandów, na których operuje. Nazywa się to przeciążeniem operatora. Np. Operator „+” może wykonywać dodawanie na dwóch liczbach całkowitych, podczas gdy może łączyć dwa ciągi. W ten sposób tego samego operatora można używać na 2 różne sposoby. Operator dodawania zwykle dodaje dwie liczby. Jednak w przypadku liczb zespolonych dodawanie jest nieco inne, gdy odpowiednie części rzeczywiste i części urojone są dodawane osobno. Oto przykładowy kod pokazujący, w jaki sposób operator „+” może zostać przeciążony, aby dodać liczby zespolone:
Kod:
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();
)
)
)
Wynik:
To wyjście ilustruje przeciążenie operatora, aby dodać dwie liczby zespolone. Kod pokazuje przeciążenie operatora, a także przeciążenie funkcji.
2. Przeciążenie funkcji
Funkcja może dawać różne dane wyjściowe na podstawie liczby parametrów, ich typów zwracanych i typu zwracanej funkcji. Wyżej wymieniony kod obejmuje również przeciążanie funkcji za pomocą konstruktora. Kod zawiera 2 konstruktory; jeden jest domyślnym konstruktorem, który pozostaje pusty, a drugi jest sparametryzowanym konstruktorem, który służy do inicjalizacji liczby zespolonej wartościami wymienionymi jako parametry.
Biorąc przykład zilustrowany na rysunku, funkcją jest formowanie gliny, a kierunkiem skoku jest element przewidziany do formowania gliny. W zależności od różnych kierunków ruchu glina jest przekształcana odpowiednio w garnek, miskę i zabawkę.
Kod:
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();
)
)
)
Wynik:
Jak zapewne zauważyłeś w kodzie, klasa gliny jest klasą nadrzędną, której klasy potomne są klasami garnków, zabawek i misek. Metoda „Mold” jest zdefiniowana w klasie nadrzędnej, a także w klasie podrzędnej o tej samej sygnaturze funkcji. Dlatego, gdy tworzony jest obiekt klasy potomnej i wywołuje on metodę Mold, metoda klasy podstawowej zostaje zastąpiona przez metodę klasy potomnej. Zatem widzimy wynik metody klasy potomnej. Powyższy kod pokazuje przesłonięcie metody, a nie przeciążenie w celu zilustrowania polimorfizmu.
Należy pamiętać o polimorfizmie w C #
- Przeciążenie różni się od zastępowania. Przeciążenie ma różne sygnatury funkcji, podczas gdy nadpisywanie ma te same sygnatury funkcji
- Polimorfizm odnosi się do zmiany zachowania nadklasy w podklasie.
- Dziedziczenie odnosi się do korzystania ze struktury i zachowania nadklasy w podklasie.
Oto kilka kluczowych rzeczy na wynos:
- Polimorfizm jest jednym z głównych paradygmatów programowania obiektowego.
- Przeciążenie funkcji modyfikuje funkcję zgodnie z typami zwracanych parametrów i parametrami w odziedziczonej klasie.
- Przeciążenie operatora modyfikuje definicję operatora zgodnie z podanymi parametrami.
- Do implementacji wykorzystywany jest polimorfizm, który w czasie wykonywania decyduje się na wywołanie metody klasy potomnej za pomocą przesłonięcia metody.
Polecane artykuły
To jest przewodnik po polimorfizmie w C #. Tutaj omawiamy dwie formy polimorfizmu w języku C #, tj. Przeciążanie operatora i przeciążanie funkcji za pomocą przykładowego kodu. Możesz także spojrzeć na następujący artykuł, aby dowiedzieć się więcej -
- Co to jest StringBuilder w C #
- Kopiuj konstruktora w C #
- Co to jest wielowątkowość w C #?
- Co to jest wzorzec projektowy w C #?
- Typy konstruktorów w C # z implementacją kodu
- Kompletny przewodnik po wielowątkowości w C #