Что такое Абстрактный класс

Ответ

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

Особенности:

  • Может содержать абстрактные методы (без реализации) и обычные методы.
  • Наследники обязаны реализовать все абстрактные методы.
  • Позволяет избежать дублирования кода.

Пример (TypeScript):

abstract class Animal {
  abstract makeSound(): void; // Абстрактный метод

  move(): void { // Обычный метод
    console.log("Moving...");
  }
}

class Dog extends Animal {
  makeSound(): void { // Обязательная реализация
    console.log("Woof!");
  }
}

const dog = new Dog();
dog.makeSound(); // "Woof!"
dog.move();      // "Moving..."

Ответ 18+ 🔞

Ну вот, сидишь ты такой, пишешь код, и тут — бац! — тебе говорят: «А сделай-ка нам класс, от которого нельзя создать объект». И ты такой: «Чё? Как это нельзя? Я ж его написал, он существует!» А это, блядь, абстрактный класс, ёпта!

Представь себе чертёж табуретки, но не саму табуретку. На чертеже всё есть: ножки, сиденье, даже размеры. Но сесть на него нельзя, это же бумага! Вот абстрактный класс — это такой чертёж для других классов. Сам по себе он — пшик, инстанциировать его нельзя, но зато он диктует правила, сука!

В чём его сила, мать его?

  • Может содержать методы, которые только объявлены, но не написаны. Это как сказать: «Наследник, у тебя ДОЛЖЕН быть метод makeSound(), а как ты его реализуешь — твои проблемы, хоть сопи, хоть свисти».
  • Может содержать и обычные, готовые методы, чтобы наследники не парились и не копипастили один и тот же код. Удобно же, блядь!
  • А главное — все, кто от него наследуется, ОБЯЗАНЫ реализовать все эти абстрактные методы. Не реализовал? Компилятор тебе ебальник набьёт, и правильно сделает! Порядок, нахуй, а не бардак.

Смотри, как это выглядит в деле (TypeScript):

abstract class Animal {
  abstract makeSound(): void; // Абстрактный метод. Просто заглушка, пустое место.

  move(): void { // А вот это уже нормальный, рабочий метод.
    console.log("Moving...");
  }
}

class Dog extends Animal {
  makeSound(): void { // А тут наследник ОБЯЗАН заполнить пустое место. И пёс это делает!
    console.log("Woof!");
  }
}

const dog = new Dog(); // А вот так уже можно, это же конкретная собака, а не абстрактное животное!
dog.makeSound(); // "Woof!"
dog.move();      // "Moving..." // И готовый метод от родителя работает, ебать его в сраку!

Короче, абстрактный класс — это такой строгий папаша, который говорит: «Вот тебе план, сынок. Основу я тебе дал, а детали — твоя головная боль. Но сделаешь не по плану — я тебе устрою ёперный театр!». И ведь правильно, а то потом в проекте одни распиздяйства начнутся.