Абстрактные классы в C#: практическое руководство с примерами кода
Что такое абстрактный класс в C#?
Абстрактный класс служит чертежом для других классов. Его нельзя инстанцировать напрямую, и он помечается ключевым словом abstract. Абстрактные классы обычно содержат один или несколько abstract или virtual методов, которые подклассы должны реализовать или переопределить. Они предоставляют общий контракт, позволяя конкретным подклассам предоставлять специфическое поведение.
Рассмотрим пример. Сначала определяем общий класс Animal, не зная, будет ли животное собакой, кошкой или чем-то ещё. Метод Description — заполнитель, который будет специализирован производными классами.

Когда конкретный тип животного известен, мы создаём подкласс, например Dog, наследующий от Animal. Класс Dog не может изменить базовый метод Description; вместо этого он предоставляет свою реализацию или добавляет новые методы вроде DogDescription. Это демонстрирует ключевую концепцию абстрактных классов C#: базовый контракт с конкретными подклассами, заполняющими детали.

Создание абстрактного класса в C#
Ниже приведено пошаговое руководство по определению абстрактного класса и конкретного подкласса, его использующего. Хотя мы не выполним этот фрагмент в онлайн-редакторе, код демонстрирует лучшие практики проектирования абстрактных классов.
Шаг 1: Определение абстрактного класса
Создаём абстрактный класс Tutorial, содержащий один virtual метод. Ключевое слово virtual указывает, что метод не может быть переопределён производными классами.

Пояснение кода
- Объявляем класс с ключевым словом
abstract, чтобы предотвратить прямое инстанцирование. - Внутри класса метод
Setопределён какpublic virtual void Set(), чтобы подклассы наследовали его без изменений.
Шаг 2: Создание производного класса
В том же файле определяем конкретный класс Guru99Tutorial, наследующий от Tutorial. Подкласс вводит свои свойства и методы, уважая контракт, установленный абстрактной базой.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication {
abstract class Tutorial {
public virtual void Set() {
// Базовая реализация (пока пустая)
}
}
class Guru99Tutorial : Tutorial {
protected int TutorialID;
protected string TutorialName;
public void SetTutorial(int pID, string pName) {
TutorialID = pID;
TutorialName = pName;
}
public string GetTutorial() {
return TutorialName;
}
static void Main(string[] args) {
Guru99Tutorial pTutor = new Guru99Tutorial();
pTutor.SetTutorial(1, ".Net");
Console.WriteLine(pTutor.GetTutorial());
Console.ReadKey();
}
}
}
Ключевой момент: Guru99Tutorial не может переобъявить метод Set, определённый в Tutorial; он должен использовать унаследованную версию как есть.
Резюме
Абстрактные классы в C# обеспечивают надёжную основу для построения расширяемых систем. Объявляя общее поведение в неинстанцируемом базовом классе, разработчики обеспечивают контракт, позволяя производным классам предоставлять конкретные реализации. Этот паттерн способствует повторному использованию кода, ясности и строгой типизации в больших кодовых базах.
Язык C
- Абстрактные классы и методы в C#: практическое руководство
- Операторы в C++: типы, примеры и практические программы
- Структуры (struct) в C++: объяснение с практическим примером
- Освоение std::list в C++: синтаксис, функции и практические примеры
- C++ Struct vs Class: ключевые отличия, синтаксис и лучшие сценарии использования
- Абстрактные классы в C#: практическое руководство с примерами кода
- Интерфейс vs Абстрактный класс в Java: Как выбрать правильную абстракцию
- Абстракция в Java: упрощение кода и повышение читаемости
- Абстракция данных в C++: разделение интерфейса и реализации
- Интерфейсы в C++: абстрактные классы и чисто виртуальные функции