الشبكة العربية لمطوري الألعاب

محترف  انس مشاركة 1

السلام عليكم.



حتى لا يكون هناك سوء تفاهم ساقوم بتوضيح المصطلحات العربية :
انشاء صنف : Object instance
الوراثة : Hiritage
تواصل الاصناف : Object comunication


الان و قد تم تحديد مضمون المصطلحات ( و التي قد اكون اخطأت في ترجمتها الى العربية) اريد معرفة الفرق بين انشاء صنف داخل كلاس ما، او الوراثة منه، اذ انه و في كلا الحالتين سنستفيد من خصائص الصنف المستهدف 
و كيف يمكن للاصناف التواصل فيما بينها اذا اردنا كتابة صنف مستقل و قابل للاستعمال في اي مشروع اخر ؟
مثال انشئت صنف : لاعب
كيف لي ان اجعله قابل للاستعمال في مشاريع اخرى ؟


اللهم اعني على فهم هذا : البرمجة الغرضية ، و اعينوني من فضلكم 🙁


سلام

مبتدئ  عمّار حرفوش مشاركة 2

انشاء صنف:
استدعاء نسخة من الصنف لاستخدام ما يحويه من دالات (Functions) او ما شابه ... و هو الاستخدام (النهائي) له
مثلا عمل عدة نسخ من الاعداء, و كل من الأعداء يستخدم صنف لعرض الجرافيك الخاص فيهم و صنف اخر للتحريك و صنف لتصادم ... الخ


الوراثة
هي بناء صنف جديد فوق صنف اخر و يرث نفس خواصه او بمعنا اخر سيحمل الصنف الجديد جميع المتغيرات و الدالات اللتي في داخل الصنف الأب كأنه هو نفسه
مثلا:
لديك صنف ممثل أو Actor و هو صنف يحوي كود للتحريك و التصادم و القفز و ما شابه.

يمكنك بناء صنف جديد و هو لاعب و تورثه خواص الصنف ممثل (Actor) و تبرمج فوقه ما يحتاجه اللاعب و عدم الاكتراث للتحرك و القفز.

ثم انشاء صنف جديد و هو "عدو" و توريثه خواص Actor و اضافة له دالات لحساب المسافة مع اللاعب و التحقق ان كان العدو يستطيع رؤية اللاعب و حساب الطريق (Path finding) ... الخ

من ثم انشاء اصناف اخرى ترث صنف العدو و صفات الممثل, لبدء العمل على النسخ النهائية من الاعداء بخواص محددة, مثلا أبو مطرقة, أبو عضلات, ساحر, كلب شرس ... الخ

و الرائع انه اي تحسين تجريه على الاصناف Actor و Enemy سيتطبق على جميع الاعداء و اللاعب.

محترف  انس مشاركة 3

شكرا اخي الكريم، افهم ما معنى المصطلحات لكن لا ارى الفرق العملي ، اي ما يمكننا فعله بانشاء الصنف يمكننا فعله بالوراثة.

خبير مدير وسام البهنسي مشاركة 4

في 17/شوال/1431 10:42 ص، قال انس بهدوء وتؤدة:

الان و قد تم تحديد مضمون المصطلحات ( و التي قد اكون اخطأت في ترجمتها الى العربية) ...

في الواقع قد أخطأت بترجمتها إلى الإنجليزية 😄  
* "إنشاء صنف" يعني كتابته وتحديد بنيته class declaration، وهذا يختلف عن مصطلح "إنشاء غرض من صنف" أو "استنساخ غرض من صنف" object instantiation والذي يعني حجز ذاكرة كافية لحمل معلومات مرتبة وفقاً لبنية الصنف، أو بعبارة أبسط: الإعلان عن متغير من نوع الصنف.
 
* "الوراثة" تقابل inheritance، أما "الإرث" heritage فليس مصطلحاً برمجياً من مصطلحات البرمجة غرضية التوجه. هناك فرق بين الاثنين...
 
* "تواصل الأصناف" يقابل class communication، أما "تواصل الأغراض" فيقابله object communication.



في 17/شوال/1431 10:42 ص، عقد انس حاجبيه بتفكير وقال:

اريد معرفة الفرق بين انشاء صنف داخل كلاس ما، او الوراثة منه، اذ انه و في كلا الحالتين سنستفيد من خصائص الصنف المستهدف

هناك فرق منطقي سنبدأ به، ثم سأطرح لك فرقاً تطبيقياً عبر مثال. 
 
علاقة "الوراثة" في البرمجة غرضية التوجه يـُقصد بها "التخصيص" specialization، أما "التضمين" containment فيقصد به علاقة "استخدام".
 
مثلاً، منطقياً، نقول أن لدينا صنف السلاح... من السلاح ينحدر السلاح الناري والسلاح الأبيض. السلاح الناري ينحدر منه المدفع والبندقية والمسدس، والسلاح الأبيض تنحدر منه العصا والسكين. كل من هاته الأصناف المنحدرة هي حالات "خاصة" من السلاح. فعندما نقول: الأسلحة ممنوعة على متن الطائرة، فإننا نعني أن كافة الأسلحة على اختلافها ممنوعة متضمنة كل الأصناف سابقة الذكر.
 
بالمقابل لو قلنا الأسلحة النارية ممنوعة في هذه المدينة، فإن هذا لا يشمل الأسلحة البيضاء، وذلك لأن المنع جاء على "حالة خاصة" من الأسلحة فقط وليست على صنف السلاح بعمومه.
 
التضمين أو الاحتواء هو علاقة مختلفة كلياً... فأنا قد أحمل أو "أحوي" سلاحاً نارياً أو سلاحاً أبيضاً رغم أني من صنف إنسان ولستُ من صنف سلاح. بل وقد أحمل أكثر من سلاح في طيات ثيابي. هل رأيت؟ منطقياً الأمر مختلف كلياً.
 
الآن لننتقل إلى الفرق التطبيقي، ولنلتزم بالمثال نفسه...
 
في اللعبة لدينا صنف سلاح له خصائص عامة مثل نطاق التأثير (قصير المدى، طويل المدى...الخ) ومقدار الأذى (جروح بسيطة، تفجير موضعي، دمار شامل). ينحدر من صنف سلاح صنف سلاح أبيض "يختص" بخصائص إضافية مثل نوع القبضة (مقبض يد واحدة، مقبض ليدين). ولدينا الصنف الثالث السلاح الناري ينحدر من صنف سلاح هو الآخر، ويختص بخصائص إضافية مثل عدد الطلقات وسرعة الإطلاق.
 
الآن لدينا صنف جندي، وهو يحمل سلاحاً... فهل هذا يعني أننا يجب أن نجعله يرث من صنف "سلاح"؟ وإن فعلنا ذلك فأي سلاح نرث؟ السلاح الناري؟ أم السلاح الأبيض؟ البندقية أم السكين؟ ماذا لو كان الجندي قادراً على تغيير سلاحه؟ وماذا لو كان الجندي يحمل أكثر من سلاح واحد؟
 
الأسئلة أعلاه لا يمكن الإجابة عنها باستخدام الوراثة، وإنما باستخدام التضمين أو الاحتواء. فنعلن عن صنف جندي، وهذا الصنف له خصائص هو الآخر... أحد هذه الخصائص هي السلاح المحمول باليد اليمنى... وهي من صنف سلاح... وهذا يعني أنه يستطيع أن يحمل في يده اليمنى أي سلاح، سواء أبيض أو سلاح ناري... ولو أضفنا للجندي خاصية أخرى هي السلاح المحمول باليد اليسرى، من نوع "سلاح أبيض"، فقد قررنا أن الجندي لا يستطيع سوى حمل السكين أو العصا بيسراه...
 
هكذا يكون صنف الجندي قد "احتوى" خاصيتين من صنف "سلاح" و "سلاح أبيض" على التوالي. لاحظ: احتوى، ولم يرث!!
 
الآن ننهي هذا الكلام بالكود الذي يعبر عنه:



class Weapon // سلاح
{
public:
  int range; // نطاق التأثير
  int damage; // مقدار الأذى
};
 
class MeleeWeapon : public Weapon // سلاح أبيض
{
public:
  bool dualHandGrip; // مقبض ليدين
};
 
class Firearm : public Weapon // سلاح ناري
{
public:
  int bulletCount; // عدد الطلقات
  int shootingRate; // سرعة الإطلاق
};
 
class Knife : public MeleeWeapon {}; // سكين
class Blackjack : public MeleeWeapon {}; // هراوة
 
class Turret : public Firearm {}; // مدفع

class Gun : public Firearm {}; // مسدس
class Shotgun : public Firearm {}; // بندقية


 
 
class Soldier // جندي
{
public:
  int team; // الفريق الخاص بالجندي
  int health; // الصحة
  Weapon* rightHandWeapon; // سلاح اليد اليمنى
  MeleeWeapon* leftHandWeapon; // سلاح اليد اليسرى
};
 
 
 
أرجو أن تكون الأمور قد توضحت لك من حيث متى نستخدم الوراثة ومتى نستخدم الاحتواء. بصراحة، الكود السابق يوضح الفكرة لكنه لا يُـظهر القدرات الكاملة للوراثة، حيث أننا لم نعرف أية إجراءات في أي من الأصناف أعلاه، لكن هذه قصة أخرى ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير مدير وسام البهنسي مشاركة 5

في 17/شوال/1431 10:42 ص، عقد انس حاجبيه بتفكير وقال:

كيف يمكن للاصناف التواصل فيما بينها اذا اردنا كتابة صنف مستقل و قابل للاستعمال في اي مشروع اخر ؟

هذه أيضاً قصة ثالثة، أرجو أن تطرحها في موضوع مستقل لنعطيها حقها من النقاش.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز