В чём разница между абстрактным классом и интерфейсом · C# Backend — JobPilot

В чём разница между абстрактным классом и интерфейсом

C# Backend · 19%
Вопрос 3370 / #
Пример ответа

Коротко: В моём опыте разработки на C# абстрактный класс позволяет частичную реализацию и состояние, а интерфейс — только контракт без реализации.

Ключевые идеи:
  • Абстрактный класс может содержать поля, свойства, конструкторы и реализованные методы, интерфейс — только сигнатуры методов, свойств и событий.
  • Класс может наследовать только один абстрактный класс, но реализовывать множество интерфейсов, что обеспечивает гибкость.
  • Абстрактный класс подходит для общего поведения в иерархии, интерфейс — для определения ролей или возможностей.
Пример: В проекте я использовал абстрактный класс BaseRepository для общих CRUD-операций с Entity Framework, а интерфейс IAuditable для добавления логирования аудита в несколько сущностей.
Пример абстрактного класса и интерфейса в C# для демонстрации различий
csharp
// Абстрактный класс с частичной реализацией
public abstract class Shape
{
    protected double Area { get; set; }
    
    public abstract double CalculateArea();
    
    public void DisplayArea()
    {
        Console.WriteLine($"Area: {Area}");
    }
}

// Интерфейс только с контрактом
public interface IDrawable
{
    void Draw();
}

// Класс, наследующий абстрактный класс и реализующий интерфейс
public class Circle : Shape, IDrawable
{
    public double Radius { get; set; }
    
    public override double CalculateArea()
    {
        Area = Math.PI * Radius * Radius;
        return Area;
    }
    
    public void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}
Вопросы для интервьюера:
  • Когда вы предпочитаете использовать интерфейс вместо абстрактного класса?Я выбираю интерфейс, когда нужно определить контракт для несвязанных классов или поддержать множественное наследование поведения.
  • Как вы решаете, что вынести в абстрактный класс в архитектуре?Я выношу общую логику и состояние, если классы имеют тесную связь и разделяют базовую реализацию, чтобы избежать дублирования кода.
Практический совет (на неделю):
  1. Начните с интерфейсов для определения контрактов в проекте, чтобы обеспечить гибкость и тестируемость.
  2. Используйте абстрактные классы, когда у вас есть общие методы или поля, которые должны наследоваться в иерархии классов.
C# Backend
Общий
19%
Навигация
В чём разница между IEnumerable и IQueryable
Предыдущий: В чём разница между IEnumerable и IQueryable

Мы используем cookie для улучшения сайта. Продолжая пользоваться сайтом, вы соглашаетесь с политикой cookie и политикой конфиденциальности.