Наследование и полиморфизм в C#: практические примеры кода
Что такое наследование в C#?
Наследование — краеугольный камень объектно-ориентированного дизайна в C#. Оно позволяет дочернему классу автоматически получать поля и методы родительского класса, сохраняя при этом возможность переопределять или расширять это поведение. Это способствует повторному использованию кода, упрощает поддержку и устанавливает чёткую иерархию.
- Определяет родительские и дочерние классы.
- Дочерний наследует члены родителя.
- Дочерний может модифицировать унаследованное поведение.
- Дочерний может добавлять свои члены.
Пример наследования в C#
Ниже приведена пошаговая демонстрация реализации наследования и использования protected-членов.
Шаг 1 – Модификация базового класса
Откройте Tutorial.cs и измените класс Tutorial так, чтобы его ключевые поля были protected:

Использование protected гарантирует, что только производные классы могут напрямую обращаться к этим полям.
Шаг 2 – Создание производного класса
Добавьте следующий код в Tutorial.cs после определения базового класса:

Пояснение:
- Объявляем
Guru99Tutorialкак наследникаTutorialс помощью двоеточия (:). - Добавляем метод
RenameTutorial, присваивающий новое значениеTutorialName. - Так как
TutorialNameзащищён,Guru99Tutorialможет к нему обращаться, хотя он не объявлен явно там.
Шаг 3 – Использование производного класса в Program.cs
Замените содержимое Program.cs на следующее:

using System;
namespace DemoApplication {
public class Tutorial {
protected int TutorialID;
protected string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
}
public class Guru99Tutorial : Tutorial {
public void RenameTutorial(string pNewName) {
TutorialName = pNewName;
}
static void Main(string[] args) {
Guru99Tutorial pTutor = new Guru99Tutorial();
pTutor.RenameTutorial(".Net by Guru99");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
Пояснение:
- Программа инстанцирует
Guru99Tutorial, а не базовыйTutorial. - Вызывает
RenameTutorialдля изменения заголовка. - Хотя
GetTutorialопределён в базовом классе, экземпляр наследника может вызывать его напрямую.
Запуск этого кода печатает:

Что такое полиморфизм в C#?
Полиморфизм позволяет одному интерфейсу представлять разные базовые формы. В C# это часто проявляется как перегрузка или переопределение методов, позволяя одному имени метода выполнять разные задачи в зависимости от параметров или контекста.
Пример полиморфизма в C#
Продемонстрируем перегрузку методов в рамках одного класса.
Шаг 1 – Обновление базового класса
Измените Tutorial.cs как показано:

Ключевые изменения:
- Метод
SetTutorialтеперь имеет две перегрузки — одна принимаетintиstring, другая — толькоstring. - Обе перегрузки присваивают значения соответствующим полям.
Шаг 2 – Тестирование в Program.cs
Замените Program.cs на следующий код:
using System;
namespace DemoApplication {
class Tutorial {
public int TutorialID;
public string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public void SetTutorial(string pName) {
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
static void Main(string[] args) {
Tutorial pTutor = new Tutorial();
pTutor.SetTutorial(1, "First Tutorial");
Console.WriteLine(pTutor.GetTutorial());
pTutor.SetTutorial("Second Tutorial");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
Пояснение:
- Первый вызов передаёт оба
idиnameв двухпараметровую перегрузку. - Второй вызов передаёт только
name, вызывая однопараметровую перегрузку.
Консоль отображает:

Для продвинутых сценариев можно добавить метод GetTutorialID для отдельного получения ID.
Резюме
- Наследование позволяет дочернему классу наследовать и расширять члены родителя.
- Полиморфизм, особенно перегрузка методов, даёт одному имени метода адаптироваться к разным наборам параметров.
- Обе концепции необходимы для чистого, поддерживаемого и повторно используемого C#-кода.
Язык C
- Выражения, операторы и блоки в C#: подробное руководство с примерами
- Классы и объекты в C#: Фундаменты надёжного ООП
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Функции в C++: подробное объяснение с практическими примерами кода
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования
- Циклы while и do-while: наглядное сравнение с практическими примерами
- Понимание type() и isinstance() в Python: практические примеры
- Структура программы на C#: основные компоненты и пример Hello World