Вступ до перекриття в C #

Перевизначення в C # - це повторна реалізація методу базового класу у похідному класі. У цьому метод базового класу переосмислюється в дочірньому класі. Метод похідного класу має те саме ім'я та підпис, що і метод базового класу. Переоцінка корисна для досягнення поліморфізму під час виконання.

Є кілька ключових слів, які використовуються при переосмисленні методу.

1. Віртуальна - Це ключове слово використовується з базовим класом, який означає, що метод базового класу можна перекрити.

public virtual void Method()
(
// implementation
)

2. Переозначення - Це ключове слово використовується з похідним класом, який означає, що похідний клас замінює метод базового класу.

public override void Method()
(
// implementation
)

3. База - Це ключове слово використовується у похідному класі для виклику методу базового класу.

public override void Method()
(
base.Method();
// implementation
)

Як переоцінка працює в C #?

Нижче наводиться приклад того, як ми можемо реалізувати переосмислення в C #.

class Parent
(
public virtual void Demo() // base class
(
Console.WriteLine(“This is parent”);
)
)
class Child: Parent
(
public override void Demo() // derived class
(
Console.WriteLine(“This is child”);
)
)

У наведеному вище прикладі є два класи, один - базовий клас або батьківський клас, а другий - похідний клас або, можна сказати, дочірній клас. Метод базового класу виведений у дочірньому класі. У цьому спосіб у батьків є віртуальним, що означає, що він може бути замінений дочірнім класом. Перевизначення в довінці означає, що цей метод такий же, як метод батьківського класу з тим же методом підпису.

Типи перевизначення в C #

Нижче наведено приклади, які показують переосмислення різних ключових слів.

Приклад 1 - Без віртуальних та переопределених ключових слів

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public new void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
// main method
static void Main(string() args)
(
Bird b = new Peacock();
b.fly();
Console.ReadLine();
)
)
)

У наведеному вище прикладі жодне ключове слово не використовується в обох базах, а також похідних методів.

Також в основному методі для виклику дочірнього методу використовується батьківська посилання. Так що в цьому випадку, коли не використовується ключове слово, замість дочірнього методу називається батьківський метод. Тож вихід буде

Вихід:

Приклад 2 (а) - із віртуальними та переопределеними ключовими словами

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
// main method
static void Main(string() args)
(
Bird b = new Peacock();
b.fly();
Console.ReadLine();
)
)
)

У цьому прикладі віртуальний використовується в базовому класі, а це означає, що він надає повноваження дочірньому класу реалізувати метод по-своєму. У похідному класі використовується override, що означає, що дочірній метод є методом override. Обидва методи однакові з однаковим іменем та однаковим підписом методу, але частина реалізації відрізняється. У цьому прикладі також батьківська посилання використовується для виклику дочірнього методу. Але оскільки батьківський метод є віртуальним, то дочірній метод називається спочатку замість батьківського методу. Тож вихід буде

Вихід:

Приклад 2 (b) - Віртуальні та переосмислені ключові слова

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
//main method
static void Main(string() args)
(
Peacock p = new Peacock();
p.fly();
Console.ReadLine();
)
)
)

Цей приклад такий самий, як і в попередньому прикладі, але цей метод використовується для посилання.

Вихід:

Приклад 3 - З базовим ключовим словом

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
base.fly(); // base is use to call parent method
Console.WriteLine("Peacock is flying");
)
)
class Program
(
static void Main(string() args)
(
Peacock p = new Peacock();
p.fly();
Console.ReadLine();
)
)
)

У наведеному вище прикладі база використовується у похідному класі для виклику методу базового класу. Тож у цьому базовому методі називається спочатку, а потім похідним методом.

Вихід:

Приклад 4 - Абстрактні класи з переосмисленням

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
abstract class Calculate
(
public abstract int sum();
)
class Values : Calculate // derived class
(
int val1;
int val2;
public Values(int a = 0, int b = 0)
(
val1 = a;
val2 = b;
)
public override int sum()
(
Console.WriteLine("sum of two values");
return (val1 + val2);
)
)
class Program
(
static void Main(string() args)
(
Values v = new Values(10, 20);
int a = v.sum();
Console.WriteLine(a);
Console.ReadLine();
)
)
)

У наведеному прикладі використовується абстрактний метод. Абстрактний клас реалізується похідним класом, який містить абстрактний метод.

Вихід:

Правила переопределення методів

  • Підпис методу похідного класу повинен бути таким же, як і базовий клас.
  • Переопределення неможливо в одному класі.
  • Модифікатори доступу повинні бути однаковими для віртуальних методів та методів переопрацювання.
  • Віртуальне ключове слово використовується в методі базового класу, а Override використовується у похідному методі класу.
  • Метод базового класу не повинен бути статичним.

Висновок

Переоцінка корисна при поліморфізмі часу виконання. Це дозволяє похідному класу реалізувати метод базового класу по-своєму. Отже реалізація методу відрізняється від похідного класу від його базового класу. Перевиконаний метод може бути віртуальним, переосмисленим або абстрактним.

Рекомендовані статті

Це посібник щодо переосмислення в C #. Тут ми обговорюємо, як використовувати переважні та різні ключові слова для переосмислення в C # разом із прикладами. Ви також можете ознайомитися з іншими запропонованими нами статтями -

  1. Обробка винятків у C #
  2. Масиви в C #
  3. Перевизначення методу в C #
  4. Змінні в C #
  5. Доступ до модифікаторів у PHP
  6. Поліморфізм на Яві
  7. Анотація класи в JavaScript
  8. Приклади цього ключового слова