---
title: "Subir Corpo de Construtor"
type: "refactoring-technique"
slug: "pull-up-constructor-body"
url: "http://localhost:3000/pt-br/pull-up-constructor-body.md"
category: "Dealing with Generalization"
description: "Problema: suas subclasses têm construtores com código quase idêntico. Solução: crie um construtor na superclasse e mova para ele o código que é igual nas subclasses. Chame o construtor da superclasse nos construtores das subclasses."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Subir Corpo de Construtor

> Problema: suas subclasses têm construtores com código quase idêntico. Solução: crie um construtor na superclasse e mova para ele o código que é igual nas subclasses. Chame o construtor da superclasse nos construtores das subclasses.

## Problem

Suas subclasses têm construtores com código quase idêntico.

## Solution

Crie um construtor na superclasse e mova para ele o código que é igual nas subclasses. Chame o construtor da superclasse nos construtores das subclasses.

## Why Refactor

Em que essa técnica de refatoração difere de [Subir Método](/pt-br/pull-up-method)?

1. Em Java, as subclasses não podem herdar um construtor, então você não pode simplesmente aplicar [Subir Método](/pt-br/pull-up-method) ao construtor da subclasse e excluí-lo após mover todo o código do construtor para a superclasse. Além de criar um construtor na superclasse, é necessário ter construtores nas subclasses com simples delegação ao construtor da superclasse.
2. Em C++ e Java (se você não chamou explicitamente o construtor da superclasse), o construtor da superclasse é chamado automaticamente antes do construtor da subclasse, o que torna necessário mover o código comum apenas do início dos construtores das subclasses (já que você não conseguirá chamar o construtor da superclasse a partir de um ponto arbitrário de um construtor de subclasse).
3. Na maioria das linguagens de programação, um construtor de subclasse pode ter sua própria lista de parâmetros, diferente dos parâmetros da superclasse. Portanto, você deve criar um construtor de superclasse apenas com os parâmetros de que ele realmente precisa.

## How to Refactor

1. Crie um construtor em uma superclasse.
2. Extraia o código comum do início do construtor de cada subclasse para o construtor da superclasse. Antes de fazer isso, tente mover o máximo possível de código comum para o início do construtor.
3. Coloque a chamada ao construtor da superclasse na primeira linha dos construtores das subclasses.
## Relations

**Similar techniques**

- [Subir Método](/pt-br/pull-up-method.md)

**Eliminates smells**

- [Código Duplicado](/pt-br/smells/duplicate-code.md)

## Code Examples

### java

```java
// Before
class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  // ...
}

// After
class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    super(name, id);
    this.grade = grade;
  }
  // ...
}
```

### csharp

```csharp
// Before
public class Manager: Employee 
{
  public Manager(string name, string id, int grade) 
  {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  // ...
}

// After
public class Manager: Employee 
{
  public Manager(string name, string id, int grade): base(name, id)
  {
    this.grade = grade;
  }
  // ...
}
```

### php

```php
// Before
class Manager extends Employee {
  public function __construct($name, $id, $grade) {
    $this->name = $name;
    $this->id = $id;
    $this->grade = $grade;
  }
  // ...
}

// After
class Manager extends Employee {
  public function __construct($name, $id, $grade) {
    parent::__construct($name, $id);
    $this->grade = $grade;
  }
  // ...
}
```

### python

```python
// Before
class Manager(Employee):
    def __init__(self, name, id, grade):
        self.name = name
        self.id = id
        self.grade = grade
    # ...

// After
class Manager(Employee):
    def __init__(self, name, id, grade):
        Employee.__init__(name, id)
        self.grade = grade
    # ...
```

### typescript

```typescript
// Before
class Manager extends Employee {
  constructor(name: string, id: string, grade: number) {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  // ...
}

// After
class Manager extends Employee {
  constructor(name: string, id: string, grade: number) {
    super(name, id);
    this.grade = grade;
  }
  // ...
}
```

