Sobes.tech
Back to questions
Junior — Middle
63

В чем заключается различие между использованием абстрактного класса и интерфейса при определении контрактов для классов?

Answer from AI

sobes.tech AI

Абстрактный класс и интерфейс в C# служат для определения контрактов, но имеют ключевые различия:

  • Абстрактный класс может содержать реализацию методов, поля, конструкторы и свойства. Он используется, когда нужно задать базовую реализацию и общий функционал для наследников.
  • Интерфейс определяет только сигнатуры методов, свойств и событий без реализации (до C# 8.0; начиная с C# 8.0 интерфейсы могут содержать реализацию по умолчанию).

Также класс может наследоваться только от одного абстрактного класса, но реализовывать множество интерфейсов.

Пример:

abstract class Animal
{
    public abstract void MakeSound();
    public void Sleep() { Console.WriteLine("Sleeping"); }
}

interface IFlyable
{
    void Fly();
}

class Bird : Animal, IFlyable
{
    public override void MakeSound() { Console.WriteLine("Chirp"); }
    public void Fly() { Console.WriteLine("Flying"); }
}

Таким образом, абстрактный класс подходит для общего базового поведения, а интерфейс — для задания набора возможностей, которые могут быть реализованы разными классами.