C # - polimorfizm
Słowo polymorphismoznacza posiadanie wielu form. W paradygmacie programowania obiektowego polimorfizm jest często wyrażany jako „jeden interfejs, wiele funkcji”.
Polimorfizm może być statyczny lub dynamiczny. Wstatic polymorphism, odpowiedź na funkcję jest określana w czasie kompilacji. Wdynamic polymorphism, decyzja jest podejmowana w czasie wykonywania.
Statyczny polimorfizm
Mechanizm łączenia funkcji z obiektem w czasie kompilacji nazywa się wczesnym wiązaniem. Nazywa się to również wiązaniem statycznym. C # udostępnia dwie techniki implementacji statycznego polimorfizmu. Oni są -
- Przeciążanie funkcji
- Przeciążanie operatorów
Omówimy przeciążenie operatorów w następnym rozdziale.
Przeciążanie funkcji
Możesz mieć wiele definicji dla tej samej nazwy funkcji w tym samym zakresie. Definicja funkcji musi różnić się od siebie typami i / lub liczbą argumentów na liście argumentów. Nie można przeciążać deklaracji funkcji, które różnią się tylko zwracanym typem.
Poniższy przykład przedstawia użycie funkcji print() wydrukować różne typy danych -
using System;
namespace PolymorphismApplication {
class Printdata {
void print(int i) {
Console.WriteLine("Printing int: {0}", i );
}
void print(double f) {
Console.WriteLine("Printing float: {0}" , f);
}
void print(string s) {
Console.WriteLine("Printing string: {0}", s);
}
static void Main(string[] args) {
Printdata p = new Printdata();
// Call print to print integer
p.print(5);
// Call print to print float
p.print(500.263);
// Call print to print string
p.print("Hello C++");
Console.ReadKey();
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Printing int: 5
Printing float: 500.263
Printing string: Hello C++
Dynamiczny polimorfizm
C # umożliwia tworzenie klas abstrakcyjnych, które są używane do zapewniania częściowej implementacji klasy interfejsu. Implementacja jest zakończona, gdy klasa pochodna dziedziczy po niej.Abstractklasy zawierają metody abstrakcyjne, które są implementowane przez klasę pochodną. Klasy pochodne mają bardziej wyspecjalizowane funkcje.
Oto zasady dotyczące klas abstrakcyjnych -
Nie można utworzyć instancji klasy abstrakcyjnej
Nie można zadeklarować metody abstrakcyjnej poza klasą abstrakcyjną
Kiedy klasa jest zadeklarowana sealed, nie może być dziedziczona, klasy abstrakcyjne nie mogą być deklarowane jako zapieczętowane.
Poniższy program demonstruje klasę abstrakcyjną -
using System;
namespace PolymorphismApplication {
abstract class Shape {
public abstract int area();
}
class Rectangle: Shape {
private int length;
private int width;
public Rectangle( int a = 0, int b = 0) {
length = a;
width = b;
}
public override int area () {
Console.WriteLine("Rectangle class area :");
return (width * length);
}
}
class RectangleTester {
static void Main(string[] args) {
Rectangle r = new Rectangle(10, 7);
double a = r.area();
Console.WriteLine("Area: {0}",a);
Console.ReadKey();
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Rectangle class area :
Area: 70
Kiedy masz funkcję zdefiniowaną w klasie, którą chcesz zaimplementować w dziedziczonej klasie (klasach), używasz virtualFunkcje. Funkcje wirtualne mogą być implementowane w różny sposób w różnych klasach dziedziczonych, a decyzja o wywołaniu tych funkcji zostanie podjęta w czasie wykonywania.
Dynamiczny polimorfizm jest realizowany przez abstract classes i virtual functions.
Poniższy program demonstruje to -
using System;
namespace PolymorphismApplication {
class Shape {
protected int width, height;
public Shape( int a = 0, int b = 0) {
width = a;
height = b;
}
public virtual int area() {
Console.WriteLine("Parent class area :");
return 0;
}
}
class Rectangle: Shape {
public Rectangle( int a = 0, int b = 0): base(a, b) {
}
public override int area () {
Console.WriteLine("Rectangle class area :");
return (width * height);
}
}
class Triangle: Shape {
public Triangle(int a = 0, int b = 0): base(a, b) {
}
public override int area() {
Console.WriteLine("Triangle class area :");
return (width * height / 2);
}
}
class Caller {
public void CallArea(Shape sh) {
int a;
a = sh.area();
Console.WriteLine("Area: {0}", a);
}
}
class Tester {
static void Main(string[] args) {
Caller c = new Caller();
Rectangle r = new Rectangle(10, 7);
Triangle t = new Triangle(10, 5);
c.CallArea(r);
c.CallArea(t);
Console.ReadKey();
}
}
}
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Rectangle class area:
Area: 70
Triangle class area:
Area: 25