Введение в переопределение в 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 # вместе с примерами. Вы также можете просмотреть наши другие предлагаемые статьи -
- Обработка исключений в C #
- Массивы в C #
- Переопределение метода в C #
- Переменные в C #
- Модификаторы доступа в PHP
- Полиморфизм в Яве
- Абстрактные классы в JavaScript
- Примеры этого ключевого слова