Абстрактные классы и интерфейсы являются фундаментальными концепциями объектно-ориентированного программирования в C#. Они оба используются для определения контракта, который должны соблюдать производные классы, но между ними существуют значительные различия.
Абстрактный класс – это класс, который может содержать как объявленные, так и реализованные методы, но не может быть создан в виде экземпляра.
Интерфейс – это контракт, который определяет только сигнатуры методов и свойств, не имея собственной реализации (до C# 8.0).
Примеры использования
Абстрактный класс
abstract class Animal
{
public abstract void MakeSound();
public void Sleep()
{
Console.WriteLine("Sleeping...");
}
}
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks");
}
}
В данном примере класс Animal
является абстрактным и содержит метод MakeSound()
, который должен быть реализован в производных классах.
Интерфейс
interface IShape
{
void Draw();
}
class Circle : IShape
{
public void Draw()
{
Console.WriteLine("Drawing a circle");
}
}
Здесь интерфейс IShape
определяет метод Draw()
, который обязан реализовать каждый класс, использующий этот интерфейс.
Когда использовать абстрактный класс, а когда интерфейс?
- Используйте абстрактный класс, если у вас есть частичная реализация методов или общий функционал, который должен наследоваться всеми подклассами.
- Используйте интерфейс, если требуется задать контракт для нескольких несвязанных классов, а реализация остаётся за каждым из них.