تسمية الحزمة
يجب أن تتجنب أسماء الحزم التعارض مع الحزم الأخرى ، لذا فإن اختيار اسم ذي معنى وفريد من نوعه هو جانب مهم لتصميم الحزمة. ومع ذلك ، يقوم المبرمجون في جميع أنحاء العالم بتطوير حزم ، ولا توجد طريقة لمعرفة من يستخدم اسم الحزمة ، لذلك اختيار اسم الحزمة الوحيد هو مشكلة. إذا قررنا أن الحزمة تستخدم فقط داخل مؤسستنا ، فيمكننا الحصول على محكم داخلي لضمان عدم وجود تعارض في الاسم بين المشاريع.
لكن بالنسبة للعالم كله ، هذا النهج ليس عمليًا. معرفات الحزمة كلها أسماء بسيطة ، وطريقة أفضل للتأكد من أن اسم الحزمة هو استخدام اسم مجال الإنترنت. إذا كانت الشركة التي نعمل فيها هي Magic.lnc واسم نطاق الشركة هو Magic C.com ، فيجب أن يكون إعلان حزمة السمات:
حزمة com.magic.attr ؛ لاحظ أن العناصر المكونة لاسم المجال هنا مرتبة بترتيب عكسي لاسم المجال التقليدي.
إذا اعتمدنا هذا المصطلح ، فلن تتعارض أسماء الحزم التي نستخدمها مع أي شخص آخر باستثناء الصراع المحتمل داخل مؤسستنا. إذا كان هناك بالفعل تعارض داخل مؤسستنا (ربما مؤسسة كبيرة) ، فيمكننا استخدام أسماء المجالات الأكثر تحديدًا لمزيد من التأهل. العديد من الشركات الكبيرة لديها نادي فرعي داخلي ، مثل شرق وأوروبا ، والتي يمكن استخدامها لزيادة تأهيل اسم الحزمة:
حزمة corn.magic.japan.attr ؛
قد يؤدي استخدام هذا الحل إلى جعل اسم الحزمة طويلًا جدًا ، لكنه آمن نسبيًا. لن يختار المبرمجون الذين يستخدمون هذه التقنية نفس اسم الحزمة ، ولن يختار المبرمجون الذين لا يستخدمون هذه التقنية الاسم الذي نستخدمه.
الوصول إلى الحزمة
عند الإعلان عن إمكانية الوصول إلى فصول المستوى الأعلى والواجهات ذات المستوى الأعلى في الحزم ، هناك خياران: الوصول إلى الحزمة (الحزمة) والوصول العام (العام). يمكن الوصول إلى الفئات أو الواجهات المعدلة مع الجمهور بواسطة رمز خارج الحزمة ، في حين أن الأنواع غير المزينة مع الجمهور لها نطاق الحزمة: يمكن الوصول إليها بواسطة رموز أخرى في نفس الحزمة ؛ لكنها مخفية للرموز خارج الحزمة ، حتى في رموز الحجز الفرعي. عند إعلان الأنواع ، يجب أن نعلن فقط تلك الأنواع التي يحتاجها المبرمجون الآخرون إلى استخدامها كجمهور ، وإخفاء تلك الأنواع التي تنتمي إلى تفاصيل تنفيذ الحزمة. توفر لنا هذه التقنية مرونة كبيرة ، وبما أن المبرمجين لا يعتمدون على هذه الأنواع من تفاصيل التنفيذ التي لا يمكنهم الوصول إليها ، يمكننا تغييرها بحرية عندما نريد تغيير تفاصيل التنفيذ.
يمكن الوصول إلى أعضاء الفصل الذين لم يتم إعلانهم على أنهم عام أو محمي أو خاص بواسطة أي رمز داخل الحزمة ، ولكن يتم إخفاءه من خارج الحزمة. وبعبارة أخرى ، فإن معدل الوصول الافتراضي هو "حزمة" ، باستثناء أعضاء الواجهة ، ومعدل الوصول الافتراضي الخاص بهم هو "عام".
يمكن الوصول إلى الحقول أو الأساليب التي لم يتم إعلانها الخاصة داخل الحزمة بواسطة جميع التعليمات البرمجية الأخرى في تلك الحزمة ، لذلك تعتبر الفئات في نفس الحزمة "ودية" أو "موثوقة". يتيح لنا ذلك تحديد إطار عمل يجمع بين الكود المحدد مسبقًا ورمز العنصر النائب ، حيث يتم تجاوز رمز العنصر النائب بواسطة فئة فرعية من فئة الإطار. يمكن أن تستخدم الرموز المحددة مسبقًا معدلات الوصول إلى الحزمة بحيث يمكن للرموز التعاونية الأخرى داخل الحزمة الوصول إليها مباشرة ، ولكن بالنسبة للمستخدمين خارج الحزم ، لا يمكن الوصول إلى هذه الرموز. ومع ذلك ، فإن الحالات الفرعية للحزم التي توجد فيها هذه الرموز ليست موثوقة والعكس بالعكس. على سبيل المثال ، لا يمكن الوصول إلى رمز معدل الوصول إلى الحزمة في الحزمة DIT بواسطة الرمز في حزمة الطفل dit.dat ، والعكس صحيح.
لذلك ، يحدد كل نوع ثلاثة عقود مختلفة:
طريقة الوصول والغطاء
يمكن كتابة الطرق التي يمكن الوصول إليها فقط في فئات فائقة في الفئات الفرعية. إذا تعذر الوصول إلى طريقة في الفئة الفائقة ، فلا يمكن تجاوز الطريقة في الفئة الفرعية حتى لو كانت الطريقة في الفئة الفرعية لها نفس اسم الطريقة. عندما يتم استدعاء طريقة في وقت التشغيل ، ينظر النظام في إمكانية وصوله وبالتالي يحدد تنفيذها.
يتم شرح المثال التالي الذي تم إنشاؤه خصيصًا بشكل أكثر وضوحًا. لنفترض أننا نعلن عن فئة القاعدة التجريدية في حزمة P1:
حزمة P1 ؛ {ab abab abab public actract class upplybase private void pri () {print ("stractbase.pri ()"):} void pac () {print ("stractbase.pac ()") show () pri () ؛ PAC () ؛ Pro () ؛ حانة()؛ }}في هذه الفئة ، نحدد 4 طرق ، ولكل منها معدل وصول مختلف ، ويحدد جسم الطريقة نفسه فقط. تُظهر الطريقة التي تُظهر هذه الطرق الأربعة على الكائن الحالي بدوره. عند تطبيق هذه الطريقة على كائنات فئة فرعية مختلفة ، يمكن أن يفسر أي تنفيذ هذه الأساليب.
الآن ، نحدد Class Concretel ، الذي يمتد فئة BustractBase ، ولكنه يقع في حزمة P2:
حزمة P2 ؛ استيراد p1.abstractbase الفئة العامة concretel يمتد الملخص {public void pri () {print ("concretel.pri ()") ؛} void pac () {print ("concretel.pac ()") ؛} public void pro () {print ("concretel.pro () pub () {print ("concretel.pub ()") ؛}}يتم إعادة تشكيل الطرق الأربعة في الفئة الفائقة في هذه الفئة ويتم تغيير تطبيقاتها ، والتي تبلغ عن أنها تنتمي إلى فئة Con-Cretel. في الوقت نفسه ، تم تغيير حقوق الوصول الخاصة بهم إلى الأماكن العامة حتى يتم الوصول إلى رمز آخر. تنفيذ الرمز التالي
concretel (). show ():
سيتم إنشاء الإخراج التالي:
AbstractBase.PRI () AbstractBase.Pac () Concretel.Pro () Concretel.pub ()
نظرًا لأنه لا يمكن الوصول إلى الطريقة الخاصة PRI بواسطة فئات فرعية (أو فئات أخرى) ، فإن طريقة العرض تدعو دائمًا إلى تنفيذ طريقة PRI في فئة AbstractBase. لا يمكن الوصول إلى طريقة PAC مع أذونات الوصول إلى الحزمة في فئة AbstractBase بواسطة Concretel ، وبالتالي لا يمكن لتنفيذ طريقة PAC في فئة Concretel تجاوز التعريف في فئة BustrictBase ، وبالتالي فإن طريقة العرض تستدعي طريقة AbstractBase.Pac. يمكن الوصول إلى طريقة PRO وطريقة الحانة في فئة Concretel ويمكن الكتابة أيضًا ، وبالتالي فإن طريقة العرض تستدعي تنفيذ هاتين الطريقتين في فئة Concretel.
اتبع Foot Way Class Class2 لتوسيع نطاق الفئة ، ثم نضعه في نفس الحزمة P1 مثل فئة AbstractBase ":
حزمة P1 ؛ استيراد p2.concretel الفئة العامة concrete2 يمتد concretel {public void pri () {print ("concrete2.pri () ؛} public void pac () {print (" concrete2 }نظرًا لأن الأساليب في Concretel لها حقوق وصول عامة ، يمكن الوصول إليها في Concrete2 ، وكل طريقة في Concrete2 تغطي أساليبها المقابلة بشكل منفصل. بالإضافة إلى ذلك ، نظرًا لأن Concrete2 و AbstractBase موجودون في نفس الحزمة ، يمكن أيضًا الوصول إلى Method AbstractBase.Pac في Concrete2 ، ويمكن تجاوز Method Concrete2.Pac. استدعاء طريقة العرض على كائن Concrete2 ، ونتيجة الطباعة هي كما يلي:
AbstractBase.PRI () concrete2.pac () concrete2.pro () concrete2.pub ()
أخيرًا ، نحدد الفئة Concrete3 لتوسيع Class Concrete2 ووضعها في الحزمة P3:
حزمة P3 استيراد P1.Concrete2 ؛ يمتد concrete3 من الفئة العامة concrete2 {public void pri () {print ("concrete3.pri ()") ؛} public void pac q {print ("concrete3.pac ()") ؛} public void pro () كائن Concrete3 ، ونتيجة الطباعة هي كما يلي: AbstractBase.pri () concrete3.pac () concrete3.pro () concrete3.pub ()هنا concrete3.pac يبدو أنه يتجاوز طريقة الملخص غير الممكنة. pac ، ولكن في الواقع ، فإن الطريقة concrete3.pac تتجاوز الطريقة concrete2.pac ، و method concrete2.pac يتجاوز method ussstructbase.pac ، لذلك method concrete3.p باك غير مبدّر عن الطريقة التجريبية. pac. من خلال إعادة تشغيل طريقة PAC في الفئة Concrete2 باعتبارها ذات أذونات وصول عامة ، يمكن الوصول إليها وإفراطها بواسطة أي فئة فرعية. '