Back to questions
Junior — Middle
64
В чем заключается различие между использованием абстрактного класса и интерфейса при определении контрактов для классов?
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"); }
}
Таким образом, абстрактный класс подходит для общего базового поведения, а интерфейс — для задания набора возможностей, которые могут быть реализованы разными классами.