---
title: "Extrair Subclasse"
type: "refactoring-technique"
slug: "extract-subclass"
url: "http://localhost:3000/pt-br/extract-subclass.md"
category: "Dealing with Generalization"
description: "Problema: uma classe tem funcionalidades que são usadas apenas em certos casos. Solução: crie uma subclasse e use-a nesses casos."
---
# Extrair Subclasse

> Problema: uma classe tem funcionalidades que são usadas apenas em certos casos. Solução: crie uma subclasse e use-a nesses casos.

## Problem

Uma classe tem funcionalidades que são usadas apenas em certos casos.

## Solution

Crie uma subclasse e use-a nesses casos.

## Why Refactor

Sua classe principal tem métodos e campos para implementar um certo caso de uso raro da classe. Embora o caso seja raro, a classe é responsável por ele e seria errado mover todos os campos e métodos associados para uma classe inteiramente separada. Mas eles poderiam ser movidos para uma subclasse, que é exatamente o que faremos com a ajuda desta técnica de refatoração.

## Benefits

* Cria uma subclasse de forma rápida e fácil.
* Você pode criar várias subclasses separadas se a sua classe principal estiver atualmente implementando mais de um desses casos especiais.

## How to Refactor

1. Crie uma nova subclasse a partir da classe de interesse.
2. Se você precisar de dados adicionais para criar objetos da subclasse, crie um construtor e adicione a ele os parâmetros necessários. Não se esqueça de chamar a implementação do construtor da classe pai.
3. Encontre todas as chamadas ao construtor da classe pai. Quando a funcionalidade de uma subclasse for necessária, substitua o construtor da classe pai pelo construtor da subclasse.
4. Mova os métodos e campos necessários da classe pai para a subclasse. Faça isso por meio de [Descer Método](/pt-br/push-down-method) e [Descer Campo](/pt-br/push-down-field). É mais simples começar movendo primeiro os métodos. Dessa forma, os campos permanecem acessíveis durante todo o processo: a partir da classe pai antes da movimentação e a partir da própria subclasse após a conclusão da movimentação.
5. Depois que a subclasse estiver pronta, encontre todos os campos antigos que controlavam a escolha da funcionalidade. Exclua esses campos usando polimorfismo para substituir todos os operadores nos quais os campos eram usados. Um exemplo simples: na classe Car, você tinha o campo `isElectricCar` e, dependendo dele, no método `refuel()` o carro era abastecido com combustível ou carregado com eletricidade. Após a refatoração, o campo `isElectricCar` é removido e as classes `Car` e `ElectricCar` terão suas próprias implementações do método `refuel()`.
## Relations

**Similar techniques**

- [Extrair Classe](/pt-br/extract-class.md)

**Eliminates smells**

- [Classe Grande](/pt-br/smells/large-class.md)

