Úvod do polymorfizmu v C #
Polymorfizmus je jedným zo zásad objektovo orientovaného programovania. Poly znamená mnohonásobné a morfovanie znamená podstúpiť transformáciu, polymorfizmus teda znamená schopnosť mať viacnásobné formy.
Výstup operátorov sa líši v závislosti od typov operandov, čo je forma polymorfizmu známa ako preťaženie operátorov. Tu môže operátor mať rôzne podoby na výrobu rôznych výstupov. Výstup funkcií sa líši v závislosti od rôznych typov návratu a parametrov, čo je ďalšia forma polymorfizmu známa ako preťaženie funkcií. Funkcia tu má viac foriem na vytvorenie viacerých výstupov.
Polymorfizmus sa vo veľkej miere používa na implementáciu dedičstva. Objekty, ktoré majú odlišnú vnútornú štruktúru, môžu implementovať spoločné rozhranie prostredníctvom polymorfizmu. Nasledujúci diagram ilustruje fungovanie polymorfizmu:
Tento obrázok vysvetľuje, že íl je materským objektom, z ktorého sú vyrobené hrnce, misky a hračky. Všetky tieto objekty sa od seba líšia, ale majú vlastnosti hliny. Tieto tri objekty majú rôzne tvary a používajú sa rôznymi spôsobmi, aj keď sú vyrobené z tej istej hliny.
Formy polymorfizmu
Nižšie sú uvedené dve formy polymorfizmu:
1. Preťaženie operátora
Operátor môže vydávať rôzne výstupy na základe typu operandov, na ktorých pracuje. Toto sa nazýva Preťaženie operátora. Napríklad operátor '+' môže vykonať sčítanie na dvoch celých číslach, zatiaľ čo môže zreťaziť dva reťazce. Rovnaký operátor tak môže byť použitý dvoma rôznymi spôsobmi. Operátor sčítania spravidla pridáva dve čísla. V prípade zložitých čísel je však sčítanie trochu iné, keď sa príslušné skutočné časti a imaginárne časti pridávajú osobitne. Tu je príklad kódu, ktorý ukazuje, ako môže byť operátor '+' preťažený pridaním komplexných čísel:
kód:
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();
)
)
)
Výkon:
Tento výstup ilustruje preťaženie operátora pridaním dvoch komplexných čísel. Kód zobrazuje preťaženie operátora, ako aj preťaženie funkcií.
2. Funkcia Preťaženie
Funkcia môže poskytnúť rôzne výstupy na základe počtu parametrov, ako aj ich návratových typov a typu návratu funkcie. Vyššie uvedený kód sa tiež týka preťaženia funkcií pomocou konštruktora. V kóde sú 2 konštruktory; jeden je predvolený konštruktor, ktorý zostáva prázdny, zatiaľ čo druhý je parametrizovaný konštruktor, ktorý sa používa na inicializáciu komplexného čísla s hodnotami uvedenými ako parametre.
Na príklade znázornenom na obrázku je funkciou formovania ílu a smer zdvihu je člen poskytnutý na formovanie ílu. Na základe rôznych smerov ťahu sa hlinka premení na hrniec, misu a hračku.
kód:
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();
)
)
)
Výkon:
Ako ste si možno všimli v kóde, trieda hliny je materská trieda, ktorej podriadené triedy sú triedy hrnca, hračky a misy. Metóda „Pleseň“ je definovaná v rodičovskej triede aj v podradenej triede s rovnakým funkčným podpisom. Preto, keď sa vytvorí objekt podradenej triedy a volá metódu Mold, metóda základnej triedy sa potlačí metódou podradenej triedy. Vidíme teda výstup metódy triedy pre deti. Vyššie uvedený kód ukazuje potlačenie spôsobu a nepreťaženie na ilustráciu polymorfizmu.
Body, ktoré treba mať na pamäti pre polymorfizmus v kroku #
- Preťaženie sa líši od nadmerného. Preťaženie má rôzne funkčné podpisy, zatiaľ čo prepísanie má rovnaké funkčné podpisy
- Polymorfizmus znamená zmenu správania nadtriedy v podtriede.
- Dedičnosť znamená použitie štruktúry a správania nadtriedy v podtriede.
Nasleduje niekoľko dôležitých krokov:
- Polymorfizmus je jedným z hlavných vzorov objektovo orientovaného programovania.
- Preťaženie funkcie upravuje funkciu podľa návratových typov a parametrov funkcie v zdedenej triede.
- Preťaženie operátora modifikuje definíciu operátora podľa daných parametrov.
- Polymorfizmus sa používa na implementáciu, ktorá sa v čase vykonávania rozhoduje zavolať metódu podriadenej triedy pomocou potlačenia metódy.
Odporúčané články
Toto je sprievodca po polymorfizme v jazyku C #. Tu diskutujeme o dvoch formách polymorfizmu v C # tj preťaženie operátora a preťaženie funkcie pomocou vzorového kódu. Viac informácií nájdete aj v nasledujúcom článku -
- Čo je StringBuilder v jazyku C #
- Kopírovať konštruktor v jazyku C #
- Čo je multithreading v jazyku C #?
- Čo je návrhový vzor v C #?
- Typy konštruktorov v jazyku C # s implementáciou kódu
- Kompletný sprievodca multithreadingom v jazyku C #