Wprowadzenie do przeciążania i przesłonięcia w C #
Polimorfizm jest jedną z ważnych koncepcji w języku C #. Istnieją dwa rodzaje polimorfizmu, czas kompilacji i czas wykonywania. Do tego celu stosuje się odpowiednio pojęcia przeciążenia i zastąpienia. W przypadku przesłonięcia klasa podrzędna może zaimplementować metodę klasy nadrzędnej w inny sposób, ale metoda klasy podrzędnej ma tę samą nazwę i tę samą sygnaturę metody co rodzic, natomiast w przypadku przeciążenia istnieje wiele metod w klasie o tej samej nazwie i różnych parametrach.
Jak działa nadpisywanie i przeciążanie w C #?
Działanie zastępowania i przeciążania w języku C # wyjaśniono poniżej przykładami:
Nadrzędny
Istnieje kilka słów kluczowych, których używamy do przesłonięcia, takich jak wirtualny, przesłonięcie i baza.
Składnia:
class Parent
(
public virtual void Example() // base class
(
Console.WriteLine(“ parent class”);
)
)
class Child: Parent
(
public override void Example() // derived class
(
base.Example();
Console.WriteLine(“Child class”);
)
)
W tym przypadku używane są słowa kluczowe wirtualne i zastępujące, co oznacza, że klasa podstawowa jest wirtualna, a klasa potomna może zaimplementować tę klasę, a zastąpienie oznacza, że ta klasa potomna ma taką samą nazwę i taką samą sygnaturę metody jak klasa nadrzędna.
Przykład 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverridingExample
(
class Subject // base class
(
public virtual void study() // base class method
(
Console.WriteLine("Study all the subjects");
)
)
class Mathematics: Subject // derived class
(
public override void study() // derived class method
(
Console.WriteLine("Study Mathematics");
)
)
class Program
(
// main method
static void Main(string() args)
(
Subject s = new Mathematics();
s.study();
Console.ReadLine();
)
)
)
W powyższym przykładzie nazwa metod jest taka sama, ale ich implementacja jest inna. Klasa podstawowa ma wirtualną i dzięki temu klasa potomna może implementować metodę klasy nadrzędnej na swój własny sposób. Metoda klasy potomnej ma przesłonięcie słowa kluczowego, co pokazuje, że jest to metoda przesłonięcia.
Wynik:
Przykład nr 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverridingExample
(
class Subject // base class
(
public virtual void study() // base class method
(
Console.WriteLine("Study all the subjects");
)
)
class Mathematics: Subject // derived class
(
public override void study() // derived class method
(
base.study();
Console.WriteLine("Study Mathematics");
)
)
class Program
(
// main method
static void Main(string() args)
(
Mathematics m = new Mathematics();
m.study();
Console.ReadLine();
)
)
)
Wynik:
W tym przykładzie klasa pochodna ma podstawowe słowo kluczowe, które służy do wywołania metody klasy podstawowej. W takim przypadku metoda pochodna jest wywoływana po metodzie klasy bazowej.
Punkty do zapamiętania:
- W koncepcji nadrzędnej nazwa metody i podpis metody oraz modyfikator dostępu są zawsze takie same jak klasa nadrzędna i podrzędna.
- Metoda klasy nadrzędnej nie może być statyczna.
Przeciążenie
W przypadku przeciążenia istnieje wiele metod z różnymi sygnaturami metod. Poniżej znajduje się kilka przykładów, które pokazują, w jaki sposób możemy osiągnąć przeciążenie, zmieniając liczbę parametrów, kolejność parametrów i typy danych parametrów.
Przykład 1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
(
class Demo
(
public int Sum(int x, int y)
(
int value = x + y;
return value;
)
public int Sum(int x, int y, int z)
(
int value = x + y + z;
return value;
)
public static void Main(string() args) // main method
(
Demo d = new Demo();
int sum1 = d.Sum(24, 28);
Console.WriteLine("sum of the two "
+ "integer value : " + sum1);
int sum2 = d.Sum(10, 20, 30);
Console.WriteLine("sum of the three "
+ "integer value : " + sum2);
Console.ReadLine();
)
)
)
W powyższym przykładzie istnieją dwie metody o tej samej nazwie, ale o różnej liczbie parametrów. Pierwsza metoda składa się z dwóch parametrów, podczas gdy druga ma trzy parametry. Nazywa się to przeciążeniem metody.
Wynik:
Przykład nr 2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
(
class Demo
(
public int Sum(int x, int y, int z)
(
int value = x + y + z;
return value;
)
public double Sum(double x, double y, double z)
(
double value = x + y + z;
return value;
)
public static void Main(string() args) // main method
(
Demo d = new Demo();
int sum1 = d.Sum(24, 28, 7);
Console.WriteLine("sum of the two "
+ "integer value : " + sum1);
double sum2 = d.Sum(10.0, 20.0, 30.0);
Console.WriteLine("sum of the three "
+ "integer value : " + sum2);
Console.ReadLine();
)
)
)
W powyższym przykładzie istnieją dwie metody o tej samej nazwie, ale ich typy danych są różne. Pierwsza metoda ma całkowity typ danych, a druga ma podwójny typ danych. Tak więc w tym przypadku parametry są różne ze względu na inny typ danych.
Wynik:
Przykład nr 3
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OverloadingExample
(
class Demo
(
public void Details(String name, int id)
(
Console.WriteLine("Name " + name + ", "
+ "Id " + id); ;
)
public void Details(int id, string name)
(
Console.WriteLine("Name " + name + ", "
+ "Id " + id);
)
public static void Main(string() args) // main method
(
Demo d = new Demo();
d.Details("John", 10);
d.Details("Joe", 20);
Console.ReadLine();
)
)
)
W powyższym przykładzie nazwy metod są takie same, ale kolejność parametrów jest inna. Pierwsza metoda ma nazwę i id odpowiednio. podczas gdy drugi ma odpowiednio identyfikator i nazwę.
Wynik:
Punkty do zapamiętania:
- W koncepcji przeciążenia nie jest możliwe zdefiniowanie więcej niż jednej metody o tych samych parametrach w przypadku zamówienia, rodzaju i liczby.
- Nie można przeciążać metody opartej na różnych typach zwrotów.
Zalety przeciążenia i przesłonięcia w C #
- Przeciążenie jest jednym ze sposobów osiągnięcia statyczności, a zastąpienie jest jednym ze sposobów, w jaki C # osiąga polimorfizm dynamiczny.
- Zapewnia elastyczność dla użytkownika i czystość kodu.
Wniosek
Przeciążenie i zastąpienie odgrywają ważną rolę w osiągnięciu polimorfizmu. Przesłonięcie pozwala implementować klasę pochodną na swój własny sposób, a przeciążenie dotyczy metod o tej samej nazwie i różnych typów implementacji parametrów.
Polecane artykuły
Jest to przewodnik po przeciążaniu i zastępowaniu w języku C #. Tutaj omawiamy działanie, składnię, zalety przeciążania i przesłonięcia w C # z przykładami i implementacją kodu. Możesz także przejrzeć następujące artykuły, aby dowiedzieć się więcej -
- Obiekty w C #
- Tablice 2D w C #
- Przesłanianie w C #
- Zamiana w C #
- Polimorfizm w Javie
- Grafika 2D w Javie
- 3 różne typy tablic w PHP (przykłady)