Úvod do polymorfismu v C #
Polymorfismus je jedním z principů objektově orientovaného programování. Poly znamená násobek a morfování znamená podstoupit transformaci, polymorfismus tedy znamená schopnost přijmout více forem.
Výstup operátorů se liší v závislosti na typech operandů, což je forma polymorfismu známá jako přetížení operátorů. Zde může operátor mít různé formy, aby produkoval různé výstupy. Výstup funkcí se liší v závislosti na různých typech návratu a parametrech, což je další forma polymorfismu známá jako přetížení funkcí. Funkce zde má několik podob, aby vytvořila více výstupů.
Polymorfismus se široce používá k implementaci dědičnosti. Objekty, které mají různou vnitřní strukturu, mohou implementovat společné rozhraní prostřednictvím polymorfismu. Následující diagram ilustruje fungování polymorfismu:
Tento obrázek vysvětluje, že jíl je rodičovským objektem, ze kterého jsou vyrobeny hrnce, misky a hračky. Všechny tyto objekty se od sebe liší, ale mají vlastnosti jílu. Tyto tři objekty mají různé tvary a používají se různými způsoby, i když jsou vyrobeny ze stejné hmotné hlíny.
Formy polymorfismu
Níže jsou uvedeny 2 formy polymorfismu:
1. Přetížení obsluhy
Operátor může dát různé výstupy na základě typu operandů, na kterých pracuje. Tomu se říká přetížení operátora. Například operátor '+' může provádět sčítání na dvou celých číslech, zatímco může zřetězit dva řetězce. Stejný operátor tak může být použit dvěma různými způsoby. Operátor sčítání obvykle přidává dvě čísla. V případě komplexních čísel je však sčítání trochu jiné, kde se odpovídající skutečné části a imaginární části přidávají samostatně. Zde je příklad kódu, který ukazuje, jak může být operátor '+' přetížen přidání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ýstup:
Tento výstup ilustruje přetížení operátora přidáním dvou komplexních čísel. Kód ukazuje přetížení operátora a také přetížení funkcí.
2. Funkce Přetížení
Funkce může poskytnout různé výstupy na základě počtu parametrů, jejich typů návratu a typu návratu funkce. Výše uvedený kód také zahrnuje přetížení funkce pomocí konstruktoru. V kódu jsou 2 konstruktory; jeden je výchozí konstruktor, který je ponechán prázdný, zatímco druhý je parametrizovaný konstruktor, který se používá k inicializaci komplexního čísla hodnotami uvedenými jako parametry.
Podle příkladu znázorněného na obrázku je funkcí formování hlíny a směr zdvihu je člen poskytnutý k formování hlíny. Na základě různých směrů tahu se hlína přemění na hrnec, misku 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ýstup:
Jak jste si možná všimli v kódu, třída hlíny je rodičovská třída, jejíž podřízené třídy jsou třídy potů, hraček a misek. Metoda 'Mold' je definována v rodičovské třídě i v podřízené třídě se stejným funkčním podpisem. Proto, když je vytvořen objekt podřízené třídy a volá metodu Mold, metoda základní třídy se přepíše metodou podřízené třídy. Vidíme tedy výstup metody podřízené třídy. Výše uvedený kód ukazuje potlačení metody a není přetížení pro ilustraci polymorfismu.
Body, které je třeba mít na paměti pro polymorfismus v c #
- Přetížení se liší od Overriding. Přetížení má různé funkční podpisy, zatímco potlačení má stejné funkční podpisy
- Polymorfismus označuje změnu chování nadtřídy v podtřídě.
- Dědičnost označuje použití struktury a chování nadřazené třídy v podtřídě.
Zde je několik klíčových akcí s sebou:
- Polymorfismus je jedním z hlavních paradigmat objektově orientovaného programování.
- Přetížení funkce modifikuje funkci podle typů návratu a parametrů funkce v zděděné třídě.
- Přetížení operátora modifikuje definici operátora podle daných parametrů.
- Polymorfismus se používá k implementaci, která se v době spuštění rozhodne zavolat metodu podřízené třídy pomocí potlačení metody.
Doporučené články
Toto je průvodce po polymorfismu v C #. Zde diskutujeme o dvou formách polymorfismu v C # tj. Přetížení operátorů a přetížení funkcí pomocí ukázkového kódu. Další informace naleznete také v následujícím článku -
- Co je StringBuilder v C #
- Kopírovat konstruktor v C #
- Co je multithreading v C #?
- Co je návrhový vzor v C #?
- Typy konstruktoru v jazyce C # s implementací kódu
- Kompletní průvodce multithreadingem v C #