---
title: "Subir el cuerpo del constructor"
type: "refactoring-technique"
slug: "pull-up-constructor-body"
url: "http://localhost:3000/es/pull-up-constructor-body.md"
category: "Dealing with Generalization"
description: "Problema: tus subclases tienen constructores con código que es casi idéntico. Solución: crea un constructor en la superclase y traslada a él el código que es igual en las subclases. Llama al constructor de la superclase desde los constructores de las subclases."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Subir el cuerpo del constructor

> Problema: tus subclases tienen constructores con código que es casi idéntico. Solución: crea un constructor en la superclase y traslada a él el código que es igual en las subclases. Llama al constructor de la superclase desde los constructores de las subclases.

## Problem

Tus subclases tienen constructores con código que es casi idéntico.

## Solution

Crea un constructor en la superclase y traslada a él el código que es igual en las subclases. Llama al constructor de la superclase desde los constructores de las subclases.

## Why Refactor

¿En qué se diferencia esta técnica de refactorización de [Subir método](/es/pull-up-method)?

1. En Java, las subclases no pueden heredar un constructor, así que no puedes simplemente aplicar [Subir método](/es/pull-up-method) al constructor de la subclase y eliminarlo tras haber trasladado todo el código del constructor a la superclase. Además de crear un constructor en la superclase, es necesario tener constructores en las subclases con una simple delegación al constructor de la superclase.
2. En C++ y Java (si no llamaste explícitamente al constructor de la superclase), el constructor de la superclase se llama automáticamente antes que el de la subclase, lo que obliga a mover el código común únicamente desde el principio de los constructores de las subclases (ya que no podrás llamar al constructor de la superclase desde un punto arbitrario de un constructor de subclase).
3. En la mayoría de los lenguajes de programación, un constructor de subclase puede tener su propia lista de parámetros distinta de la de la superclase. Por tanto, deberías crear un constructor en la superclase solo con los parámetros que realmente necesita.

## How to Refactor

1. Crea un constructor en una superclase.
2. Extrae el código común del principio del constructor de cada subclase al constructor de la superclase. Antes de hacerlo, intenta mover al principio del constructor todo el código común que puedas.
3. Coloca la llamada al constructor de la superclase en la primera línea de los constructores de las subclases.
## Relations

**Similar techniques**

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

**Eliminates smells**

- [Código Duplicado](/es/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;
  }
  // ...
}
```

