---
title: "Remonter le corps du constructeur"
type: "refactoring-technique"
slug: "pull-up-constructor-body"
url: "http://localhost:3000/fr/pull-up-constructor-body.md"
category: "Dealing with Generalization"
description: "Problème : vos sous-classes ont des constructeurs dont le code est en grande partie identique. Solution : créez un constructeur dans la superclasse et déplacez-y le code commun aux sous-classes. Appelez le constructeur de la superclasse dans les constructeurs des sous-classes."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# Remonter le corps du constructeur

> Problème : vos sous-classes ont des constructeurs dont le code est en grande partie identique. Solution : créez un constructeur dans la superclasse et déplacez-y le code commun aux sous-classes. Appelez le constructeur de la superclasse dans les constructeurs des sous-classes.

## Problem

Vos sous-classes ont des constructeurs dont le code est en grande partie identique.

## Solution

Créez un constructeur dans la superclasse et déplacez-y le code commun aux sous-classes. Appelez le constructeur de la superclasse dans les constructeurs des sous-classes.

## Why Refactor

En quoi cette technique de refactorisation diffère-t-elle de [Remonter une méthode](/fr/pull-up-method) ?

1. En Java, les sous-classes ne peuvent pas hériter d'un constructeur ; vous ne pouvez donc pas simplement appliquer [Remonter une méthode](/fr/pull-up-method) au constructeur de la sous-classe puis le supprimer après avoir remonté tout le code du constructeur vers la superclasse. En plus de créer un constructeur dans la superclasse, il est nécessaire d'avoir dans les sous-classes des constructeurs qui se contentent de déléguer au constructeur de la superclasse.
2. En C++ et en Java (si vous n'avez pas appelé explicitement le constructeur de la superclasse), le constructeur de la superclasse est automatiquement appelé avant celui de la sous-classe, ce qui oblige à ne déplacer le code commun que depuis le début des constructeurs des sous-classes (puisque vous ne pourrez pas appeler le constructeur de la superclasse depuis un endroit arbitraire d'un constructeur de sous-classe).
3. Dans la plupart des langages de programmation, un constructeur de sous-classe peut avoir sa propre liste de paramètres, différente de celle de la superclasse. Vous ne devriez donc créer le constructeur de la superclasse qu'avec les paramètres dont il a réellement besoin.

## How to Refactor

1. Créez un constructeur dans une superclasse.
2. Extrayez le code commun du début du constructeur de chaque sous-classe vers le constructeur de la superclasse. Auparavant, essayez de déplacer autant de code commun que possible au début du constructeur.
3. Placez l'appel au constructeur de la superclasse sur la première ligne des constructeurs des sous-classes.
## Relations

**Similar techniques**

- [Remonter une méthode](/fr/pull-up-method.md)

**Eliminates smells**

- [Code dupliqué](/fr/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;
  }
  // ...
}
```

