Пример ответа
Коротко: В моём опыте разработки на 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");
}
}
Вопросы для интервьюера:
- Когда вы предпочитаете использовать интерфейс вместо абстрактного класса? — Я выбираю интерфейс, когда нужно определить контракт для несвязанных классов или поддержать множественное наследование поведения.
- Как вы решаете, что вынести в абстрактный класс в архитектуре? — Я выношу общую логику и состояние, если классы имеют тесную связь и разделяют базовую реализацию, чтобы избежать дублирования кода.
Практический совет (на неделю):
- Начните с интерфейсов для определения контрактов в проекте, чтобы обеспечить гибкость и тестируемость.
- Используйте абстрактные классы, когда у вас есть общие методы или поля, которые должны наследоваться в иерархии классов.
C# Backend
Общий
19%
Предыдущий: В чём разница между IEnumerable и IQueryable