---
title: "رفع متن الباني (Pull Up Constructor Body)"
type: "refactoring-technique"
slug: "pull-up-constructor-body"
url: "http://localhost:3000/ar/pull-up-constructor-body.md"
category: "التعامل مع التعميم"
description: "المشكلة: تحتوي فئاتك الفرعية (Subclasses) على بانيات (Constructors) بها كود متطابق غالباً. الحل: أنشئ بانيًا للفئة الفائقة (Superclass) وانقل الكود المشترك في الفئات الفرعية إليه. واستدعِ باني الفئة الفائقة في بانيات الفئات الفرعية."
languages: ["java", "csharp", "php", "python", "typescript"]
---
# رفع متن الباني (Pull Up Constructor Body)

> المشكلة: تحتوي فئاتك الفرعية (Subclasses) على بانيات (Constructors) بها كود متطابق غالباً. الحل: أنشئ بانيًا للفئة الفائقة (Superclass) وانقل الكود المشترك في الفئات الفرعية إليه. واستدعِ باني الفئة الفائقة في بانيات الفئات الفرعية.

## المشكلة

تحتوي فئاتك الفرعية (Subclasses) على بانيات (Constructors) بها كود متطابق غالباً.

## الحل

أنشئ بانيًا للفئة الفائقة (Superclass) وانقل الكود المشترك في الفئات الفرعية إليه. واستدعِ باني الفئة الفائقة في بانيات الفئات الفرعية.

## دواعي إعادة الهيكلة

كيف تختلف تقنية إعادة الهيكلة هذه عن تقنية [رفع التابع (Pull Up Method)](/pull-up-method)؟

1. في لغة Java، لا يمكن للفئات الفرعية وراثة الباني، لذا لا يمكنك ببساطة تطبيق تقنية [رفع التابع (Pull Up Method)](/pull-up-method) على باني الفئة الفرعية وحذفه بعد نقل كل الكود إلى الفئة الفائقة. بالإضافة إلى إنشاء باني في الفئة الفائقة، من الضروري وجود بانيات في الفئات الفرعية تقوم بالتفويض البسيط لباني الفئة الفائقة.
2. في لغتي C++‎ وJava (إذا لم تستدعِ باني الفئة الفائقة صراحة)، يتم استدعاء باني الفئة الفائقة تلقائياً قبل باني الفئة الفرعية، مما يجعل من الضروري نقل الكود المشترك فقط من بداية بانيات الفئات الفرعية (حيث لن تتمكن من استدعاء باني الفئة الفائقة من مكان عشوائي في باني الفئة الفرعية).
3. في معظم لغات البرمجة، يمكن أن يحتوي باني الفئة الفرعية على قائمة معاملات خاصة به تختلف عن معاملات الفئة الفائقة. لذلك، يجب إنشاء باني الفئة الفائقة فقط مع المعاملات التي يحتاجها حقاً.

## كيفية إعادة الهيكلة

1. أنشئ بانيًا (Constructor) في الفئة الفائقة (Superclass).
2. استخرج الكود المشترك من بداية باني كل فئة فرعية إلى باني الفئة الفائقة. وقبل القيام بذلك، حاول نقل أكبر قدر ممكن من الكود المشترك إلى بداية الباني.
3. ضع استدعاء باني الفئة الفائقة في السطر الأول من بانيات الفئات الفرعية.
## Relations

**Similar techniques**

- [رفع التابع (Pull Up Method)](/ar/pull-up-method.md)

**Eliminates smells**

- [الكود المكرر](/ar/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;
  }
  // ...
}
```

