Введение в переопределение в C #

Переопределение в C # - это повторная реализация метода базового класса в производном классе. В этом метод базового класса переопределяется в дочернем классе. Метод производного класса имеет то же имя и сигнатуру, что и метод базового класса. Переопределение полезно для достижения полиморфизма во время выполнения.

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

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

public virtual void Method()
(
// implementation
)

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

public override void Method()
(
// implementation
)

3. Base - это ключевое слово используется в производном классе для вызова метода базового класса.

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();
)
)
)

В этом примере virtual используется в базовом классе, что означает, что он дает полномочия дочернему классу для реализации метода по-своему. В производном классе используется переопределение, что означает, что дочерний метод является методом переопределения. Оба метода одинаковы с одинаковыми именами и сигнатурой, но часть реализации различна. В этом примере также родительская ссылка используется для вызова дочернего метода. Но поскольку родительский метод является виртуальным, дочерний метод вызывается первым вместо родительского. Таким образом, выход будет

Выход :

Пример 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)
(
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();
)
)
)

В приведенном выше примере используется абстрактный метод. Абстрактный класс реализуется производным классом, который содержит абстрактный метод.

Выход :

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

  • Подпись метода производного класса должна совпадать с базовым классом.
  • Переопределение невозможно в одном классе.
  • Модификаторы доступа должны быть одинаковыми для виртуальных методов и методов переопределения.
  • Ключевое слово virtual используется в методе базового класса, а Override - в методе производного класса.
  • Метод базового класса не должен быть статическим.

Вывод

Переопределение полезно при полиморфизме во время выполнения. Это позволяет производному классу реализовать метод базового класса по-своему. Таким образом, реализация метода отличается от производного класса от его базового класса. Переопределенный метод может быть виртуальным, переопределенным или абстрактным.

Рекомендуемые статьи

Это руководство по переопределению в C #. Здесь мы обсудим, как использовать переопределение и другие ключевые слова для переопределения в C # вместе с примерами. Вы также можете просмотреть наши другие предлагаемые статьи -

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