Bevezetés a C polimorfizmusba
A polimorfizmus az objektum-orientált programozás egyik alapelve. A poly többszörös és morfikus eszköz egy átalakuláson keresztül, a polimorfizmus tehát többféle formájú képességet jelent.
Az operátorok kimenete az operandus típusától függően változik, ami egy operátor túlterhelésnek nevezett polimorfizmus egyik formája. Itt az operátor többféle formátumban is előállíthat különböző kimeneteket. A függvények kimenete a különféle visszatérési típusoktól és paraméterektől függően változik, ami a polimorfizmus egy másik formája, amelyet Funkció-túlterhelésnek hívnak. Itt a függvény többféle formát ölt, hogy több kimenetet hozzon létre.
A polimorfizmust széles körben alkalmazzák az öröklés megvalósításához. Az eltérő belső szerkezetű objektumok a polimorfizmus révén megvalósíthatnak egy közös felületet. A következő ábra szemlélteti a polimorfizmus működését:
Ez az ábra magyarázza, hogy az agyag az a szülő tárgy, amelyből edényt, tálat és játék tárgyat készítenek. Ezek a tárgyak különböznek egymástól, de agyag tulajdonságaik vannak. Ez a három tárgy különböző formájú, és eltérő módon használják, még akkor is, ha ugyanazon anyagból készültek.
A polimorfizmus formái
Az alábbiakban a polimorfizmus két formája látható:
1. Üzemeltető túlterhelése
Az operátor különféle kimeneteket adhat az operandusok típusa alapján. Ezt operátor túlterhelésnek hívják. Például, a „+” operátor két egész számot is végrehajthat, miközben két karakterláncot összeilleszthet. Így ugyanazt a kezelőt kétféleképpen lehet használni. Az összeadási operátor általában két számot ad hozzá. Komplex számok esetén azonban az összeadás kissé eltér, ha a megfelelő valós és képzeletbeli részeket külön-külön hozzáadjuk. Íme egy példakód, amely megmutatja, hogy a '+' operátor hogyan lehet túlterhelt komplex számok hozzáadásához:
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();
)
)
)
Kimenet:
Ez a kimenet illusztrálja az operátor túlterhelését két összetett szám hozzáadásához. A kód megmutatja a kezelő túlterhelését, valamint a funkció túlterhelését.
2. Funkció túlterhelése
Egy függvény különféle kimeneteket adhat a paraméterek száma, valamint azok visszatérési típusa és a funkció visszatérési típusa alapján. A fent említett kód kiterjed a funkció túlterhelésére is konstruktor segítségével. A kódban 2 konstruktor van; az egyik az alapértelmezett konstruktor, amely üresen marad, míg a másik egy paraméteres konstruktor, amelyet a komplex szám paraméterként megadott értékekkel való inicializálására használnak.
Az ábrán szemléltetett példa szerint az agy formázása és a csapás iránya az agy öntésére szolgáló elem. A különböző löket-irányok alapján az agyag alakul át az edényben, a tálban és a játékban.
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();
)
)
)
Kimenet:
Amint azt a kódban megjegyezte, az agyag osztály az a szülő osztály, amelynek gyermek osztályai pot, játék és tál osztályok. A „Mold” módszer meghatározása a szülői osztályban, valamint a gyermekosztályban azonos funkcióaláírással történik. Ennélfogva, amikor a gyermekosztály objektumát létrehozzák és meghívják a Mold módszerre, akkor az alap osztály módszerét felülbírálják a gyermek osztály módszerével. Így látjuk a gyermek osztály módszer kimenetet. A fenti kód a polimorfizmus szemléltetése érdekében felülírja és nem terheli a módszert.
A polimorfizmus szempontjából szem előtt tartandó szempontok #
- A túlterhelés különbözik a felülbírálástól. A túlterhelésnek eltérő funkciói aláírása van, míg a felülbírálásnak ugyanaz a funkció aláírása
- A polimorfizmus az alosztály szuperosztályának viselkedésének megváltoztatására utal.
- Az öröklés azt jelenti, hogy egy alosztályban egy szuperosztály szerkezetét és viselkedését használjuk.
Az alábbiakban bemutatjuk néhány kulcsfontosságú elvitelre:
- A polimorfizmus az objektum-orientált programozás egyik fő paradigmája.
- A függvény túlterhelése módosítja a függvényt az örökölt osztály függvényének visszatérési típusai és paraméterei szerint.
- Az operátor túlterhelése módosítja az operátor meghatározását az adott paraméterek szerint.
- A polimorfizmus végrehajtására úgy dönt, hogy futás közben úgy dönt, hogy a gyermek osztályú módszert meghívja a módszer felülbírálására.
Ajánlott cikkek
Ez egy útmutató a polimorfizmushoz a C # -ben. Itt tárgyaljuk a C # polimorfizmusának két formáját, azaz az operátorok túlterhelését és a funkciók túlterhelését mintakóddal. A következő cikkben további információkat is megnézhet -
- Mi a StringBuilder a C # -ben?
- Másoló konstruktor a C # -ben
- Mi a többszálú C # -ben?
- Mi az a mintázat a C # -ben?
- A konstruktor típusai a C # kód bevezetésével
- Teljes útmutató a többszálú szalagra C #