Чем отличается класс от абстрактного класса?csharp-37

Основное различие между обычным классом и абстрактным классом в C# заключается в их назначении и возможностях использования. Давайте разберём ключевые отличия.

1. Создание экземпляров

  • Обычный класс можно инстанцировать (создавать его объекты) напрямую.
  • Абстрактный класс нельзя инстанцировать напрямую — он предназначен только для наследования.
// Обычный класс
var person = new Person(); // OK

// Абстрактный класс
// var animal = new Animal(); // Ошибка компиляции!

2. Наличие абстрактных членов

  • Обычный класс может не содержать абстрактных методов (но может).
  • Абстрактный класс может (и обычно содержит) абстрактные методы (без реализации), которые должны быть реализованы в производных классах.
public abstract class Animal
{
    public abstract void MakeSound(); // Абстрактный метод (нет реализации)
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Гав!");
    }
}

3. Цель использования

  • Обычный класс:

    • Используется для создания конкретных объектов.
    • Может быть конечным (не предназначенным для наследования).
  • Абстрактный класс:

    • Служит базовым классом для других классов.
    • Определяет общий интерфейс и частичную реализацию для производных классов.
    • Часто используется в паттернах проектирования (например, Template Method).

4. Модификатор abstract

  • Абстрактный класс всегда объявляется с ключевым словом abstract.
  • Обычный класс не имеет этого модификатора.
public abstract class Shape  // Абстрактный класс
{
    public abstract double GetArea();
}

public class Circle : Shape  // Обычный класс-наследник
{
    public double Radius { get; set; }

    public override double GetArea()
    {
        return Math.PI * Radius * Radius;
    }
}

5. Запечатанность

  • Обычный класс может быть помечен как sealed, запрещая наследование.
  • Абстрактный класс не может быть sealed (противоречит его назначению).
public sealed class MySealedClass { } // OK
// public abstract sealed class InvalidClass { } // Ошибка!

Когда использовать абстрактный класс?

  • Когда нужно задать общий интерфейс для группы связанных классов.
  • Когда часть реализации может быть общей для всех наследников.
  • Когда нужно обязать наследников реализовать специфичное поведение.

Когда использовать обычный класс?

  • Когда нужны конкретные экземпляры.
  • Когда полная реализация известна и не требует расширения.

Резюмируем:

главное отличие — абстрактный класс нельзя инстанцировать, и он часто содержит абстрактные члены, которые должны быть реализованы в наследниках. Обычный класс — это законченная сущность для создания объектов, хотя и может участвовать в наследовании.