---
title: "Извлечение суперкласса"
type: "refactoring-technique"
slug: "extract-superclass"
url: "http://localhost:3000/ru/extract-superclass.md"
category: "Решение задач обобщения"
description: "Проблема: У вас есть два класса с общими полями и методами. Решение: Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы."
---
# Извлечение суперкласса

> Проблема: У вас есть два класса с общими полями и методами. Решение: Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы.

## Problem

У вас есть два класса с общими полями и методами.

## Solution

Создайте для них общий суперкласс и перенесите туда одинаковые поля и методы.

## Why Refactor

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

## Benefits

* Убирает дублирование кода. Общие поля и методы теперь «живут» только в одном месте.

## How to Refactor

1. Создайте абстрактный суперкласс.
2. Используйте [подъём поля](/ru/pull-up-field), [подъём метода](/ru/pull-up-method) и [подъём тела конструктора](/ru/pull-up-constructor-body) для перемещения общей функциональности в суперкласс. Лучше начинать с полей, так как помимо общих полей, вам нужно будет перенести те из них, которые используются в общих методах.
3. Стоит поискать места в клиентском коде, в которых можно заменить использование подклассов вашим общим классом (например, в объявлениях типов).
## Relations

**Similar techniques**

- [Извлечение интерфейса](/ru/extract-interface.md)

**Eliminates smells**

- [Дублирование кода](/ru/smells/duplicate-code.md)

