Junior
125
questionbank
Использовали ли вы абстрактные классы в своих проектах?
Answer from AI
sobes.tech AI
Да, использовал. Абстрактные классы применялись для создания базовых структур с общими методами и свойствами, которые затем наследуются конкретными классами.
// Объявление абстрактного класса
public abstract class Shape
{
// Абстрактный метод, который должен быть реализован в наследующих классах
public abstract double GetArea();
// Виртуальный метод с реализацией по умолчанию, который может быть переопределен
public virtual void Draw()
{
Console.WriteLine("Drawing a shape.");
}
}
// Конкретный класс, наследующий от Shape
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// Реализация абстрактного метода
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
// Переопределение виртуального метода
public override void Draw()
{
Console.WriteLine($"Drawing a circle with radius {Radius}.");
}
}
Основные сценарии использования:
- Определение общего контракта: Абстрактные классы позволяют задать набор методов и свойств, которые должны присутствовать у всех производных классов.
- Частичная реализация: Возможность предоставить частичную реализацию функциональности в базовом классе, избегая полной дубликации кода в наследниках.
- Шаблон проектирования: Часто используются в реализации шаблонов, таких как "Шаблонный метод".
Различия с интерфейсами:
| Признак | Абстрактный класс | Интерфейс |
|---|---|---|
| Наследование | Множественное наследование запрещено | Множественная реализация разрешена |
| Реализация | Может содержать реализацию методов | До C# 8.0 - только объявления, после - реализация по умолчанию |
| Члены | Могут иметь поля, конструкторы, виртуальные/абстрактные/обычные методы | До C# 8.0 - только методы и свойства, после - также статичные члены и default-реализации |
| Состояние | Могут иметь состояние (через поля) | Не могут иметь состояние |