Sobes.tech
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-реализации
Состояние Могут иметь состояние (через поля) Не могут иметь состояние