ايه هو الفرق بين ال inheritance و ال composition ؟؟
السؤال ده لقيته على اكس انهاردة. و عجبني...
فحبيت أتكلم عنه أكتر....
و اللي عنده سؤال يكتبه تحت
الوراثة (Inheritance) والتركيب (Composition) هما طريقتين في البرمجة الكائنية (Object-Oriented Programming) عشان نعمل كائنات (Objects) بتستخدم أكواد موجودة قبل كده.
بس الفرق بين الوراثة والتركيب بسيط.
الوراثة (Inheritance):
الوراثة زي لما تقول: "عندي كائن (Object) جديد وعايز ياخد كل الحاجات اللي موجودة في كائن تاني."
يعني الكائن الجديد بيورث الخصائص (Attributes) والوظائف (Methods) من كائن تاني. مثلا، لو عندك كائن اسمه حيوان، وكائن تاني اسمه قطة، ممكن تخلي القطة تورث الحاجات اللي عند الحيوان زي "التحرك" و"الأكل".
- مثال:
- القطة تورث الخصائص دي من الحيوان:
- الحيوان يعرف يتحرك
- الحيوان يعرف يأكل
في الحالة دي، القطة مش بتكتب من أول وجديد طريقة الأكل أو التحرك، هي بس بتاخدهم من الحيوان.
التركيب (Composition):
التركيب يعني بدل ما الكائن ياخد الحاجات (الخصائص والوظائف) من كائن تاني زي الوراثة، الكائن الجديد بيدمج كائنات تانية جواه ويستخدمها. زي لما تعمل كائن جديد وتقول: "أنا محتاج كائنات تانية جوايا تساعدني."
- مثال:
- عندنا كائن اسمه سيارة. السيارة مكونة من كائنات تانية زي محرك وعجلات. السيارة بتستخدم المحرك والعجلات، لكن مش بتورثهم.
في التركيب، الكائن بيكون جواه حاجات تانية، وبيستخدمها من غير ما ياخد كل خصائصها ووظائفها زي الوراثة.
الفرق ببساطة:
- الوراثة: الكائن الجديد بياخد كل الحاجات من كائن موجود وبيقدر يعدل عليها.
- التركيب: الكائن الجديد بيستخدم كائنات تانية جواه عشان ينفذ وظائفه.
الوراثة مناسبة لما يكون فيه علاقة "هو نوع من" (is a)، والتركيب مناسب لما يكون فيه علاقة "مكوّن من" (has a).
هوريلك مثال بسيط في JavaScript عشان توضح الفرق بين الوراثة (Inheritance) والتركيب (Composition).
الوراثة (Inheritance)
في المثال ده، عندنا كائن (class) اسمه Animal، وهنعمل كائن تاني اسمه Cat بيورث الخصائص والوظائف من Animal.
// Class Animal
class Animal {
constructor(name) {
this.name = name;
}
move() {
console.log(`${this.name} is moving.`);
}
}
// Class Cat بيورث من Animal
class Cat extends Animal {
constructor(name, breed) {
super(name); // استدعاء الكونستركتور بتاع Animal
this.breed = breed;
}
meow() {
console.log(`${this.name} says meow!`);
}
}
const myCat = new Cat('Tom', 'Siamese');
myCat.move(); // Tom is moving.
myCat.meow(); // Tom says meow!
في المثال ده، الكائن Cat ورث وظيفة move() من Animal، وده معناه إن Cat يقدر يتحرك زي ما Animal بيعمل من غير ما نكرر الكود.
التركيب (Composition)
في المثال ده، مش هنستخدم الوراثة، ولكن هنستخدم التركيب. هنركب كائن Engine جوا كائن Car.
// Class Engine
class Engine {
start() {
console.log('Engine started.');
}
}
// Class Car
class Car {
constructor() {
this.engine = new Engine(); // تركيب كائن Engine جوا Car
}
drive() {
this.engine.start(); // السيارة بتستخدم المحرك عشان تشتغل
console.log('Car is driving.');
}
}
const myCar = new Car();
myCar.drive();
// Engine started.
// Car is driving.
في المثال ده، Car بيستخدم Engine من خلال التركيب (Composition)، من غير ما يورث أي حاجة من Engine.
السيارة بتشغل المحرك وبتسوق، وكل كائن بيعمل وظيفته.

