جهات الاتصال

ما هو معدل الوصول الذي يمكن تطبيقه على الحزمة. معدلات الوصول. خاص ، محمي ، افتراضي ، عام. التحكم في الوصول والميراث

سنحاول هنا تغطية جميع حالات استخدام معدِّلات الوصول تقريبًا. الاستثناءات الوحيدة هي استخدامها للأغراض المتداخلة ( متداخلة) وداخلي ( داخلي) ، وكذلك للواجهات ، لأننا لم نفكر في هذه الموضوعات بعد.

تعمل الفئات والحزم المستخدمة جنبًا إلى جنب مع معدِّلات الوصول كوسائل تغليف ، أي وسيلة لإخفاء تفاصيل التنفيذ خلف واجهة بسيطة.

يمكن تطبيق مُعدِّلات الوصول على كلٍّ من الفئات وأعضائها - الحقول والأساليب. هناك أربعة مُعدِّلات وصول إجمالاً ، وسنقدم هنا وصفًا موجزًا ​​لها ، ثم سننظر في كل منها بالتفصيل.

  • عام- تم التصريح عن أي مكون باسم عام، يمكن الوصول إليها من أي رمز
  • محمي- يسمح بالوصول إلى المكون داخل الحزمة وفئات المتحدرين
  • نشر- يسمح بالوصول إلى المكونات داخل الفصل
  • إفتراضي(بدون كلمة رئيسية) - يسمح بالوصول إلى المكونات الموجودة داخل الحزمة

الفصول الموروثة هي فئات موروثة من الفصل. لم ندرس الميراث بعد.

الوصول إلى الفصول

بشكل افتراضي ، تتوفر فئات المستوى الأعلى في الحزمة التي تم تعريفها فيها.... ومع ذلك ، إذا تم التصريح عن فئة المستوى الأعلى باسم عامإذن فهي متوفرة في كل مكان (أو في أي مكان تتوفر فيه الحزمة نفسها). لقد قصرنا هذا البيان على فئات المستوى الأعلى لأنه يمكن إعلان الفئات كأعضاء في فئات أخرى. نظرًا لأن هذه الفئات الداخلية أعضاء في الفصل ، فإنها تخضع لقواعد التحكم في الوصول إلى أعضاء الفصل..

الوصول إلى أعضاء الفصل

أعضاء الفصل موجودون دائمًا داخل جسم الفصل. تقصيريتوفر أعضاء الفصل أيضًا في الحزمة التي يتم فيها تعريف الفئة.

المعدل العام

بالنسبة للفئة غير المتداخلة ، يمكن تحديد مستوى واحد فقط من مستويي الوصول المحتملين: معطى إفتراضيو عام . عندما يتم الإعلان عن الفصل كـ عام، يجب أن يكون هو الوحيد عامتم الإعلان عن الفئة في الملف ويجب أن يتطابق اسم الملف مع اسم الفئة.

كيف عاميمكن الإعلان عن الفئات والحقول والأساليب والمُنشئين.

معدل محمي

سنلقي نظرة فاحصة على هذا المعدل في موضوع وراثة الفصل. إذا لم يتم استخدام الوراثة ، فعندئذٍ يعمل هذا المعدل ، تمامًا مثل المعدل الافتراضي.

الشيء الوحيد الذي يمكن قوله بإيجاز الآن هو أن المكونات تم إعلانها كـ محميسوف يكون الوصول أي فئة طفل من أي حزمةأو أي فئة من نفس الباقة.

كيف محمييمكن الإعلان عن الحقول والأساليب والمنشئات والفئات المتداخلة والواجهات المتداخلة.

محمي .

معدل خاص

هذا هو المعدّل الأكثر تقييدًا من حيث تقييد الوصول. تم إعلان العناصر كـ نشريمكن الوصول إليها فقط داخل نفس الفصل ولا يمكن الوصول إليها لأي شخص خارج الفصل.

كيف نشريمكن الإعلان عن الحقول والأساليب والمنشئات والفئات المتداخلة والواجهات المتداخلة.

لا يمكن التصريح عن واجهات وفئات المستوى الأعلى كـ نشر .

تعد معدّلات الوصول موضوعًا بسيطًا ، لكننا سنعود إليها لاحقًا. بينما كان مجرد أحد معارفه. والآن القليل من الممارسة ...

لقد أنشأت فئات Mod02.java و DefMod.java و ProMod.java و PrvMod.java تنتمي إلى الحزمة pro.java.pkg002 ، بالإضافة إلى فئة PubMod.java التي تنتمي إلى الحزمة pro.java.pkg003. بعد ذلك ، سأقدم فقط لقطات شاشة لهذه الفئات ونتائج البرنامج:

سنتحدث عن المعدلات: ما هي المعدلات ، النطاقات ، المعدلات للفئات ، الحقول ، الطرق. أعتقد أنه لن يكون مملاً.

المعدلات في جافاهي الكلمات الأساسية التي تعطي فئة أو حقل فئة أو طريقة خصائص معينة.

للإشارة إلى إمكانية رؤية فئة من أساليبها وحقولها ، توجد 4 معدلات وصول:

  • نشرلا يمكن الوصول إلى أعضاء الفصل إلا داخل الفصل ؛
  • حزمة خاصة أو افتراضية (افتراضي)يظهر أعضاء الفصل داخل الحزمة ؛
  • محمييتوفر أعضاء الفصل داخل الحزمة وفي الفئات المشتقة ؛
  • عامأعضاء الفصل متاحون للجميع.

إذا كنت تتذكر ، في النهاية ، عندما قمنا بالفعل باستيراد فئة Cat ، فلا يزال لدينا خطأ في التجميع.

الشيء هو أننا لم نسجل أي معدّلات وصول إلى حقولنا وطرقنا ، ولديهم خاصية افتراضية (أعضاء الفئة مرئيون داخل الحزمة). لإصلاح خطأ الترجمة في الكود الخاص بنا وتشغيله أخيرًا ، نحتاج إلى جعل المُنشئ والطرق الخاصة بنا عامة. ثم يمكن استدعاؤها من الحزم الأخرى.

قد تبدأ في التساؤل: لماذا كل هذا؟ لماذا لا نجعل الكود مرئيًا من أي حزمة أو فئة ، لكنك بحاجة إلى التمييز بين الوصول؟ ستختفي هذه الأسئلة من تلقاء نفسها عندما يحين الوقت لكتابة مشاريع معقدة ومرهقة. الآن ، عندما نكتب تطبيقات تقتصر وظائفها على فئة أو فئتين ، يبدو أنه ليس من المنطقي تقييد أي شيء.

تخيل أن لديك فئة تعرض كائن منتج. على سبيل المثال سيارة. قد يكون للسيارة ثمن. لقد أنشأت حقل سعر والعديد من المجالات الأخرى ، ومجموعة من الطرق المسؤولة عن الوظيفة. يبدو أن كل شيء على ما يرام. إن سيارة صفك جزء من مشروع ضخم والجميع سعداء. ولكن لنفترض أن شخصًا ما ، عن طريق الخطأ أو عن قصد ، قام بإنشاء مثيل لفئة السيارة وحدد سعرًا سلبيًا. كيف يمكن للمنتج أن يكون له سعر سلبي؟ هذا مثال بدائي للغاية ومن غير المرجح أن يحدث في الحياة الواقعية ، لكنني أعتقد أن الفكرة واضحة. تحتاج أحيانًا إلى منح حق الوصول ليس بشكل مباشر ، ولكن من خلال طرق معينة. قد تكون الشفرة مسؤولة عن وظائف الكود الآخر ، ولا تريد أن يقوم شخص ما بتغيير وتعديل جزء من كودك. لهذا كله ، هناك قيود على الوصول.

يمكن أن يكون معدّل الوصول للمنشئين والأساليب والحقول أي شيء. يمكن للفصل أن يكون إما عامًا أو افتراضيًا ، ولا يمكن أن يكون هناك سوى فصل عام واحد في ملف واحد.

في الوقت الحالي ، سيكون هناك ما يكفي حول مُعدِّلات الوصول. في مقال "البرمجة الشيئية" سنتحدث عنها بمزيد من التفصيل ، ولكن الآن دعنا نتحدث عن المعدلات الأخرى التي ، بالمناسبة ، هناك الكثير.

الآن المعدل التالي هو ثابتة... يمكن استخدامه أمام طريقة أو حقل أو حتى فئة عندما نريد إعلان فئة متداخلة. في Java ، يمكنك كتابة فئات داخل فئات أخرى ، وإذا كان المُعدِّل قبل الفئة داخل الفئة static ، فإن هذه الفئة تسمى متداخلة ، إذا كان هناك معدل آخر أو افتراضيًا ، فإن هذه الفئة تسمى داخلية. سيكون هناك مقال منفصل عن الطبقات المتداخلة والداخلية ، لأن كل شيء ليس بهذه البساطة هناك.

يشير المعدل الثابت أمام الأسلوب أو الحقل إلى أنه لا ينتمي إلى مثيل من هذه الفئة. ماذا يعني هذا بالنسبة لنا؟ عندما وصفنا حقل أو طريقة للفصل على أنها ثابتة ، يمكن استدعاؤها دون استخدام مثيل للفئة. أي ، بدلاً من هذا البناء: Cat cat = new Cat () ؛ cat.method () ، يمكنك فقط كتابة Cat.method (). بشرط أن تكون الطريقة ثابتة. المتغيرات الثابتة هي نفسها لجميع كائنات الفئة. لديهم ارتباط واحد.

    معدِّلات الطبقة العامة (

    ثابت int anotherStaticField = 5 ؛

    myStaticMethod () () الفراغ الثابت العام

    someField = "حقلي" ؛

    // nonStaticField = "" ؛ خطأ في التحويل

    // لا يمكن استخدام الحقول غير الثابتة

    // في طرق ثابتة

    myNonStaticMethod () باطل عام

    otherStaticField = 4 ؛ // يمكن استخدام الحقول الثابتة

    // في طرق غير ثابتة

    // الطريقة الرئيسية لها أيضًا معدل ثابت

    المعدلات الجديدة () .myNonStaticMethod () ،

    Modificators.myStaticMethod () ، // استدعاء الأساليب والحقول الثابتة

    // عبر classname.method

شيء آخر مهم يجب ملاحظته حول المعدلات الثابتة هو أن الحقول الثابتة يتم تهيئتها في وقت تحميل الفصل. غالبًا في أنواع مختلفة من اختبارات Java ، يمكنك العثور على الكود التالي:

سؤال: ما الذي سيتم عرضه على وحدة التحكم؟ يجب أن نتذكر أنه سيتم عرض الكتلة الثابتة أولاً في أي حال. التالي سيكون الكتلة الافتراضية. بعد ذلك ، انظر إلى شاشة وحدة التحكم:

سيكون التعديل التالي الذي سننظر إليه هو نهائي.

أعتقد أن الكلمة الأخيرة تتحدث عن نفسها. من خلال تطبيق المُعدِّل النهائي ، فأنت تقول إنه لا يمكن تغيير الحقول ، وتم تجاوز الطرق ، ولا يمكن توريث الفئات (ستكون هناك مقالة منفصلة عن الوراثة). ينطبق هذا المعدل فقط على الفئات والطرق والمتغيرات (أيضًا على المتغيرات المحلية).

سنتحدث عن المعدل النهائي للطرق والفئات في مقالة OOP.

بعد ذلك ، ستكون هناك معدِّلات لن تكون واضحة جدًا للمبتدئين أو أولئك الذين يقرؤون سلسلة المقالات هذه من البداية. وعلى الرغم من أنني ما زلت لا أستطيع شرح كل شيء لك (نظرًا لحقيقة أنك لا تعرف المواد المصاحبة) ، ما زلت أنصحك بالتعرف عليها. عندما يحين وقت استخدام هذه المعدلات ، ستفهم بالفعل معظم المصطلحات المستخدمة أدناه.

المعدل متزامن- يشير إلى أن الطريقة يمكن استخدامها بواسطة مؤشر ترابط واحد فقط في كل مرة. في حين أن هذا قد لا يخبرك بأي شيء ، فإن فائدة هذا المعدل ستظهر عندما نتعلم عن تعدد مؤشرات الترابط.

المعدل عابر- يقول أنه أثناء تسلسل الكائن ، يجب تجاهل بعض الحقول. عادةً ما تقوم هذه الحقول بتخزين القيم الوسيطة.

المعدل متطايره- تستخدم لتعدد مؤشرات الترابط. عندما يتم استخدام حقل به معدل متغير وتغييره بواسطة خيوط متعددة ، فإن هذا المعدل يضمن أن الحقل سيتغير بدوره ولن يكون هناك ارتباك معه.

المعدل محليقبل إعلان الطريقة يشير إلى أن الطريقة مكتوبة بلغة برمجة أخرى. عادة في C.

المعدل صارم- يوفر أداء العمليات على عدد من النوع float و double (floating point) وفقًا لمعيار IEEE 754. أو ، ببساطة أكثر ، يضمن أن نتائج العمليات الحسابية في طريقة ما ستكون هي نفسها على جميع الأنظمة الأساسية.

لم أتحدث عن المعدل بعد نبذة مختصرة... سأخبرك عن ذلك باختصار ، لأنه بدون معرفة أساسيات البرمجة الموجهة للكائنات ، لا أرى أي فائدة من الحديث عنها.

لا يمكن إنشاء مثيل للفئة التي تحتوي على معدِّل مجردة. الغرض الوحيد من ذلك هو التوسع. يمكن أن تحتوي فئة مجردة على كل من الأساليب المجردة وكذلك الطرق العادية.

سنتحدث أكثر عن المعدل المجرد في مقالة OOP.

هذا يختتم المقال على المعدلات. لم يقال الكثير عنهم. ولكن هذا يرجع إلى حقيقة أنه ليس لدينا مفاهيم OOP حتى الآن. في عدد قليل من المقالات الأخرى ، سنتوسع في المُعدِّلات ونملأ الفراغات.

أولاً ، دعنا نلقي نظرة على معدّلات الوصول. لا يوجد سوى أربعة منهم:

  • نشرلا يمكن الوصول إلى أعضاء الفصل إلا داخل الفصل
  • حزمة خاصة أو افتراضية (افتراضي)يظهر أعضاء الفصل داخل الحزمة
  • محمييتوفر أعضاء الفصل داخل الحزمة وفي الفئات المشتقة
  • عامأعضاء الفصل متاحون للجميع

أثناء الوراثة ، من الممكن تغيير معدلات الوصول نحو رؤية أكبر.

يمكن أن يكون معدّل الوصول للمُنشئين والأساليب والحقول موجودًا ، ولكن مع الفئات وكتلها ليس بهذه البساطة. يمكن للفصل أن يكون إما عامًا أو افتراضيًا ، ولا يمكن أن يكون هناك سوى فصل عام واحد في ملف واحد. يمكن أن تحتوي الكتلة على معدل واحد فقط - افتراضي.

المعدلات الثابتة والمجردة والنهائية

ثابتة

  • ينطبق على الفئات والطرق والمتغيرات والكتل المنطقية الداخلية
  • يتم تهيئة المتغيرات الثابتة في وقت تحميل الفصل
  • المتغيرات الثابتة هي نفسها لجميع كائنات الفئة (نفس المرجع)
  • الأساليب الثابتة لديها فقط الوصول إلى المتغيرات الثابتة
  • يمكن الوصول إلى الطرق والمتغيرات الثابتة من خلال اسم الفئة
  • يتم تنفيذ الكتل الثابتة في وقت تحميل الفصل
  • لا يمكن تجاوز الأساليب غير الثابتة على أنها ثابتة
  • لا يمكن التصريح عن المتغيرات المحلية بأنها ثابتة
  • لا يمكن أن تكون الأساليب المجردة ثابتة
  • الحقول الثابتة غير متسلسلة (فقط عند تنفيذ واجهة Serializable)
  • يمكن فقط تمرير متغيرات الفئة الثابتة إلى المُنشئ باستخدام المعلمات ، والتي يتم استدعاؤها عبر الكلمة super (// المعلمة //) أو هذه (// المعلمة //)

الملخص

  • ينطبق فقط على الأساليب والفئات
  • الأساليب المجردة ليس لها طريقة الجسم
  • إنه عكس النهائي: لا يمكن وراثة فئة نهائية ، يجب أن ترث فئة مجردة
  • يجب التصريح عن فئة مجردة إذا:
  1. يحتوي على طريقة مجردة واحدة على الأقل
  2. لا يوفر تطبيقًا للأساليب المجردة الموروثة
  3. لا يوفر تطبيقًا لأساليب الواجهة التي أعلنت عن تنفيذها
  4. من الضروري حظر إنشاء مثيلات للفئة

نهائي

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

المُعدِّلات الصارمة ، العابرة ، المتقلبة ، المتزامنة ، الأصلية

Strictfp

  • ينطبق على الأساليب والفئات
  • يوفر عمليات على الأرقام العائمة والمزدوجة (الفاصلة العائمة) وفقًا لمعيار IEEE 754

عابر

  • ينطبق فقط على متغيرات مستوى الفئة (لا يمكن التصريح عن المتغيرات المحلية على أنها عابرة)
  • قد لا تكون المتغيرات العابرة نهائية أو ثابتة.
  • المتغيرات العابرة ليست متسلسلة

متطايره

  • تستخدم مع المتغيرات فقط
  • يمكن استخدامها مع المتغيرات الثابتة
  • غير مستخدم مع المتغيرات النهائية - يتم تغيير قيمة المتغير المعلن على أنه متغير متغير بواسطة مؤشر ترابط واحد بشكل غير متزامن لمؤشرات الترابط الأخرى
  • تستخدم في التطبيقات متعددة الخيوط

متزامن

  • ينطبق فقط على الطرق أو أجزاء الطريقة
  • تستخدم للتحكم في الوصول إلى أجزاء مهمة من التعليمات البرمجية في البرامج متعددة مؤشرات الترابط

محلي

  • تستخدم فقط للطرق
  • يشير إلى أن الطريقة تمت كتابتها بلغة برمجة أخرى
  • تستخدم الفئات في Java العديد من الأساليب الأصلية لتحسين الأداء والوصول إلى الأجهزة
  • من الممكن تمرير / إرجاع كائنات Java من الطرق الأصلية
  • يجب أن ينتهي توقيع الأسلوب بـ "؛" ، سوف تتسبب الأقواس المتعرجة في حدوث خطأ في التجميع

الميزات الموجودة في الواجهات

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

لنجمع كل المُعدِلات معًا:

فصل

الطبقة الداخلية

عامل

طريقة

البناء

كتلة المنطق

عام

نعم

نعم

نعم

نعم

نعم

لا

محمي

لا

نعم (باستثناء الفصول المحلية والمجهولة)

نعم

نعم

نعم

لا

إفتراضي

نعم

نعم

نعم

نعم

نعم

نشر

لا

نعم (باستثناء الفصول المحلية والمجهولة)

نعم

نعم

نعم

لا

نهائي

نعم

نعم (ومتغير محلي)

نعم

لا

لا

نبذة مختصرة

نعم

نعم (باستثناء الفئات المجهولة)

لا

نعم

لا

لا

ثابتة

لا

نعم (باستثناء الفصول المحلية والمجهولة)

نعم

نعم

لا

نعم

محلي

لا

لا

لا

نعم

لا

لا

عابر

لا

لا

نعم

لا

لا

لا

متزامن

لا

لا

لا

نعم

لا

نعم (فقط كجزء من الطريقة)

متطايره

لا

لا

نعم

لا

لا

لا

صارم

نعم

نعم

لا

نعم

لا

لا

5

لقد رأيت بعض المناقشات على StackOverflow حول هذا الموضوع ، لكنني لا أرى شيئًا ساعدني في فهم النقطة التالية:

لقد جئت من خلفية C ++ وبدأت مؤخرًا في تعلم Java. في C ++ ، عندما محمي، يتم استخدام فئة فرعية فقط يمكنها الوصول إلى العضو (مشابه لحقل في Java).

توجد أيضًا فصول للأصدقاء بلغة C ++ يمكنها الوصول إلى الكاميرات الخاصة / المحمية للفصل التي تمنح الصداقة. هذا يشبه إلى حد ما معدِّل حقل "الحزمة" في Java (معدل الحقل الافتراضي) ، باستثناء أنه في C ++ ، تتيح الصداقة الوصول إلى جميع الأعضاء الخاصين ، ولكن في Java ، يكون الوصول من الفصول في حزمة واحدة خاصًا بالفئة حقل.

ما لا أستطيع معرفته ، بافتراض أنني أريد فقط توفير الوصول إلى الفئات الفرعية ، هو ما يمكنني فعله في C ++ من خلال إعلان أعضاء محميين في فصل لا "يمنح" صداقات.

لكن في Java لا أعرف كيفية القيام بذلك ، لأنه بمساعدة مُعدِّل المجال "المحمي" - أتيح أيضًا الوصول إلى جميع الفئات الموجودة في الحزمة. الطريقة الوحيدة التي أجدها هي إعلان حقل محمي وعزل الفصل في حزمته.

من هذا استنتج أن تجميع الفصول في حزمة واحدة يجب أن يتم على أساس "الصداقة" بين الطبقات. هل هذا حقًا هو العامل الرئيسي عند تجميع الحزم؟

شيء آخر لا أفهمه ، في Java ، بافتراض أن لدي حقلين في الفئة A: b ، c. أريد منح B حق الوصول إلى b ولكن ليس إليه ، وأريد منح C إمكانية الوصول إلى c ولكن ليس b. وإلى "السلام" أريد أن أخفي ب ، ج. كيف أقوم بذلك؟ أفترض أن B و C يجب أن يكونا في نفس الحزمة مثل A. ولكن بالتصريح عن b ، c بـ حزمةمع المعدل ، أسمح لـ B و C بالوصول إلى كل من b و. هل هناك طريقة في جافا للقيام بذلك؟

نأمل في بعض الشرح لهذا السؤال

11

السؤال الأفضل ، إذا كان أقل فائدة ، سيكون أضيق وأكثر تحديدًا. السؤال العام "كل شيء عن الخصوصية في Java و C ++ وكيف يختلفان" هو أكثر من كونه واسعًا جدًا. هل يمكنك طرح سؤال أكثر تحديدًا حول مشكلة أكثر تحديدًا؟ - ياك 04 مارس 15 2015/03/04 16:38:58

  • 4 إجابات
  • فرز:

    نشاط

2

في C ++ ، عند استخدام الأمان ، يمكن فقط للفئة الفرعية الوصول إلى العنصر (مشابه لحقل في Java).

محددات الوصول هي أيضًا لوظائف / طرق الأعضاء ، وليس فقط متغيرات الأعضاء.

في C ++ ، توجد أيضًا فصول "صديقة" يمكنها الوصول إلى مامبراس خاصين / محميين في الفصل ، مما يعطي "صداقة". يشبه هذا إلى حد ما معدِّل حقل "الحزمة" في Java (معدِّل الحقل الافتراضي) ، باستثناء أنه في C ++ ، تتيح الصداقة الوصول إلى جميع الأعضاء الخاصين ، ولكن في Java ، يقتصر الوصول من الفصول في نفس الحزمة إلى مجال الفصل.

لا توجد فصول للأصدقاء فحسب ، بل توجد أيضًا وظائف.

صحيح أن الوصول إلى أجزاء Java الخاصة مشابه ، لكنه ليس بديلاً كاملاً. من الأفضل أن نقول أن هاتين الوظيفتين لها مجموعة فرعيةالمشاكل التي حلوها. هناك مشاكل يمكن أن يحلها صديق ، ولكن ليس من خلال حزمة خاصة ، والعكس صحيح.

ما لم أستطع معرفته ، بافتراض أنني أريد فقط توفير الوصول إلى الفئات الفرعية ، هو ما يمكنني فعله في C ++ من خلال إعلان حماية المستخدمين في فصل دراسي لا "تمنحه" الصداقة.

لكن في Java ، لا أعرف كيف يمكنني القيام بذلك ،

الجواب: لا يمكنك.

منذ بمساعدة مُعدِّل حقل "محمي" - أتيح أيضًا الوصول إلى جميع الفئات الموجودة في الحزمة.

الطريقة الوحيدة التي يمكنني العثور عليها هي إعلان حقل محمي وعزل الفصل في حزمته.

من الناحية الفنية ، نعم. لكن هذا يخلق مشاكل أخرى. لن يتمكن فصلك بعد الآن من الوصول إلى أجزاء الحزمة الخاصة من الحزمة السابقة. لنفترض أن BaseClass الخاص بك كان في com.example.one. ستنقله إلى com.example.two. الآن لن يكون قادرًا على الوصول إلى حزم فئة خاصة أخرى من com.example.one.

هل هذا حقًا هو العامل الرئيسي عند تجميع الحزم؟

نعم ، تم تصميم Java بهذه الطريقة. يمكنك المحاولة محاربة قواعد اللغةلكنها معركة خاسرة في أي لغة برمجة.

شيء آخر لا أفهمه في Java ، بافتراض أن لدي حقلين في الفئة A: b ، c. أريد منح B حق الوصول إلى b ولكن ليس إليه ، وأريد منح C إمكانية الوصول إلى c ولكن ليس b. وفي "العالم" أريد إخفاء ب ، ج. كيف أقوم بذلك؟

لا يمكن القيام بذلك بطريقة نظيفة (أعني نظيفة: بدون أي اختراقات تتطلب منك التحقق من مكدس المكالمات في وقت التشغيل ورمي الاستثناءات).

إذا كنت قلقًا بشأن هذا السيناريو لأنك تقوم بتطوير واجهة برمجة تطبيقات عامة ، فإن أحد الحلول منخفضة التقنية التي تعمل بشكل رائع عادةً هو إنشاء حزمة أو أكثر *. داخلية وتوثيق بوضوح حقيقة أنه لا ينبغي استخدامها في كود العميل.

1

هذه مجموعة من الأسئلة معًا ...

لكن في Java ، لا أعرف كيف يمكنني القيام بذلك ، لأنه بحكم استخدام مُعدِّل حقل "محمي" - أتيح أيضًا الوصول إلى جميع الفئات الموجودة في الحزمة.

في الواقع ، لا توجد طريقة لتوفير الوصول إلى الفئات الفرعية فقط ، ولكن ليس هناك فئات في نفس الحزمة. لقد كان قرار تصميم تم اتخاذه منذ قرون ...

الطريقة الوحيدة التي أجدها هي إعلان حقل محمي وعزله في الحزمة الخاصة بي.

هذا صحيح من الناحية الفنية ، على الرغم من أنه لن يكون ذا فائدة تذكر. التفاف الفئة مخصص لتجميع الفئات ذات الصلة ، حيث تعني "الأشقاء" "الفئات التي تفي بعلاقة معينة" ، أي أنهم ينتمون إلى حالة الاستخدام نفسها ، وينتمون إلى نفس المستوى المعماري ، وينتمون إلى نفس الكيانات ، وما إلى ذلك.

من هذا استنتج أن تجميع الفصول في حزمة واحدة يجب أن يتم على أساس "الصداقة" بين الطبقات. هل هذا حقًا هو العامل الرئيسي عند تجميع الحزم؟

أعتقد أنني أجبت بالفعل على هذا في الفقرة السابقة: التغليف مخصص لتجميع الفئات ذات الصلة وفقًا لبعض المعايير المحددة.

لفئاتك A و B و C ، على سبيل المثال مع السمات:

أعتقد أن كل من B و C يجب أن يكونا في نفس الحزمة ، A يعلن b ، مع معدِّل التعبئة سمحت لـ B و C بالوصول إلى كل من b و k. هل هناك طريقة في Java للقيام بذلك؟

الجواب لا ، لا توجد طريقة سهلة ونظيفة للقيام بذلك. يمكنك تحقيق ذلك ببعض الاختراقات أو التقنيات الأكثر تقدمًا ، ولكن مرة أخرى ، كان هذا جزءًا من القرارات التي اتخذها مطورو اللغة منذ فترة طويلة ...

0

إجابة مختصرة: لا توجد طريقة للقيام بذلك.

إذا كنت قلقًا بشأن التطفل من حقن عملاء الفصل في حزمة للحصول على وصول غير مصرح به ، فيمكنك نقل الكود الحساس في حزمة منفصلة ، وجعل الحزمة مغلقة في جرة تقوم بتسليمها إلى: http://docs.oracle. com / javase / tutorial /deployment/jar/sealman.html

1

من المفترض ضمنيًا أن جميع الفئات في الحزمة "تعرف" بعضها البعض (لأنها كتبها نفس الشخص / الشركة / المنظمة). بهذه الطريقة ، إما لا يتمكنون من الوصول إلى الحقول المحمية ، أو إذا فعلوا ذلك ، فإنهم يعرفون كيفية القيام بذلك بشكل صحيح.

يُفترض أن تكون الفئات الموجودة في نفس الحزمة أكثر ارتباطًا ببعضها البعض أكثر من ارتباط الأصل بالفئة المشتقة ، لأن الفئة المشتقة قد تكون مكتوبة بالفعل بواسطة شخص آخر. لذلك قرروا أن الحماية الخاصة كانت محدودة أكثر من الحماية.

لذلك ، أعتقد أنه لا داعي للقلق بشأن كيفية وصول الفصول في نفس الحزمة إلى حقول بعضها البعض. بشكل عام ، أنا لا أستخدم هذه الوظيفة ، إلا عندما أكتب مكررات.

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

يمكنك بالطبع التوصل إلى بروتوكول تبادل رمزي معقد لجعل هذا الحقل متاحًا فقط لمثيلات B / C ، ولكن هذا سيكون عبئًا رائعًا ولا يزال بإمكان كائن آخر استخدام الانعكاس للوصول إلى جميع الأعضاء الخاصين إذا لم تقم بتعطيله باستخدام سياسات الأمان ، وهو ما لا يحدث عادةً ، ولكن مرة أخرى ، يتم تحديد السياسات الأمنية في النهاية بواسطة مالك JVM.

لذا ، فإن الطريقة المفضلة لفعل ما تقوله في Java هي إما وضعها في نفس الحزمة ، أو كتابة B و C كفئتين داخليتين من A حتى يتمكنوا من الوصول مباشرة إلى الأعضاء الخاصين في A وتعريضهم للفئات المشتقة .

الفئة العامة A (فئة الملخص الثابتة العامة B (المحمية مهما يكن الحصول على أي شيء (A a) (إرجاع ab ؛) مجموعة باطلة محمية مهما كانت (A a ، مهما كانت القيمة) (ab = value ؛)) فئة الملخصات العامة الثابتة C (المحمية مهما كان الحصول على أي شيء (أ) أ) (إرجاع ac ؛) مجموعة باطلة محمية مهما كانت (أ أ ، أيا كانت القيمة) (ac = القيمة ؛)) خاص أيا كان ب ؛ خاص أيا كان ج ؛)

مرة أخرى ، تعتقد دائمًا أن الفصول في نفس الحزمة لن ترتكب أي خطأ أبدًا.

آخر تحديث: 03.10.2019

جميع أعضاء الفصل - الحقول والأساليب والخصائص - لديهم جميعًا معدلات الوصول... تسمح لك معدِّلات الوصول بتعيين نطاق صالح لأعضاء الفصل الدراسي. أي أن معدِّلات الوصول تحدد السياق الذي يمكن فيه استخدام متغير أو طريقة معينة. في الموضوعات السابقة ، واجهناها بالفعل عندما أعلنا أن حقول الفصل ستكون عامة (أي مع المُعدِّل العام).

يتم استخدام معدلات الوصول التالية في C #:

    عامة: فئة عامة أو عامة أو أحد أعضاء الفصل. يمكن الوصول إلى عضو الفصل هذا من أي مكان في الكود ، وكذلك من البرامج والتجمعات الأخرى.

    خاص: فئة خاصة أو عضو في فئة. يمثل العكس تمامًا من المعدل العام. لا يمكن الوصول إلى مثل هذا الفصل الخاص أو عضو الفصل إلا من التعليمات البرمجية الموجودة في نفس الفئة أو السياق.

    محمي: يمكن الوصول إلى عضو الفصل هذا من أي مكان في الفصل الحالي أو في الفئات المشتقة. ومع ذلك ، يمكن وضع الفئات المشتقة في التجميعات الأخرى.

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

    داخلي محمي: يجمع بين وظائف معدلين. تتوفر الفئات وأعضاء الفصل مع هذا المعدل من التجميع الحالي ومن الفئات المشتقة.

    محمية خاصة: يمكن الوصول إلى عضو الفئة هذا من أي مكان في الفصل الحالي أو في الفئات المشتقة المحددة في نفس التجميع.

يمكننا تحديد معدّل الوصول بشكل صريح ، على سبيل المثال:

حالة فئة محمية خاصة (int a ؛ محمية باطلة Print () (Console.WriteLine ($ "a = (a)") ؛))

أو يمكننا تخطي التحديد:

حالة الفئة (int a ؛ void Print () (Console.WriteLine ($ "a = (a)") ؛))

إذا لم يتم تحديد معدل وصول للحقول والأساليب ، فسيتم استخدام المعدل الخاص لها افتراضيًا.

الفئات والبنى التي تم الإعلان عنها بدون معدل لها وصول داخلي افتراضيًا.

كل الفئات والبنى التي تم تحديدها بشكل مباشر في مساحات الأسماء غير المتداخلة ضمن فئات أخرى يمكن أن تحتوي فقط على مُعدِّلات عامة أو داخلية.

لنلقِ نظرة على مثال وننشئ فئة الولاية التالية:

الحالة العامة للفئة العامة (// هي نفسها الخاصة الافتراضية الخاصة ، Var ؛ int defaultVar ؛ // لا يمكن الوصول إلى الحقل إلا من الفئة الحالية الخاصة بـ privateVar ؛ // يمكن الوصول إليها من الفئة الحالية والفئات المشتقة التي تم تحديدها في نفس المشروع المحمي private int protectPrivateVar؛ // متاح من الفئة الحالية والفئات المشتقة المحمية int protectedVar ؛ // متاح في أي مكان في المشروع الحالي الداخلي int interiorVar ؛ // متاح في أي مكان في المشروع الحالي ومن الفئات الموروثة في مشاريع أخرى محمية داخلية محمية intternalVar ؛ // متاح في أي مكان في البرنامج ، وكذلك للبرامج والتجمعات الأخرى public int publicVar ؛ // افتراضيًا يحتوي على معدِّل خاص باطل defaultMethod () => Console.WriteLine ($ "defaultVar = (defaultVar)") ؛ / / لا يمكن الوصول إلى هذه الطريقة إلا من الفئة الحالية void privateMethod () => Console.WriteLine ($ "privateVar = (privateVar)") ؛ // يمكن الوصول إليها من الفئة الحالية والفئات المشتقة المحددة في نفس الفقرة محمية خاصة محمية باطلة بروتيفاتميثود () => Console.WriteLine ($ "protectedPrivateVar = (protectedPrivateVar)") ؛ // يمكن الوصول إليها من الفئة الحالية والفئات المشتقة المحمية void protectedMethod () => Console.WriteLine ($ "protectedVar = (protectedVar)") ؛ // متاح في أي مكان في الفراغ الداخلي الداخلي للمشروع الحالي internalMethod () => Console.WriteLine ($ "internalVar = (internalVar)") ؛ // متاح في أي مكان في المشروع الحالي ومن الفئات الموروثة في مشاريع أخرى محمية باطلة داخلية محمية بروتنيرنال ميثود () => Console.WriteLine ($ "protectedInternalVar = (protectedInternalVar)") ؛ // متوفر في أي مكان في البرنامج ، بالإضافة إلى البرامج والتجمعات الأخرى public void publicMethod () => Console.WriteLine ($ "publicVar = (publicVar)")؛ )

نظرًا لأنه تم الإعلان عن فئة الولاية باستخدام المُعدِّل العام ، فسيكون الوصول إليها متاحًا من أي مكان في البرنامج ، وكذلك من البرامج والتجمعات الأخرى. تحتوي فئة الولاية على خمسة حقول لكل مستوى وصول. بالإضافة إلى متغير واحد بدون معدل ، والذي يكون خاصًا بشكل افتراضي.

هناك أيضًا ست طرق تعرض قيم حقول الفصل على الشاشة. يرجى ملاحظة أنه نظرًا لأن جميع المعدلات تسمح لك باستخدام أعضاء الفصل داخل هذه الفئة ، فإن جميع متغيرات الفئة ، بما في ذلك المتغيرات الخاصة ، متاحة لجميع طرقها ، نظرًا لأنها كلها في سياق فئة الدولة.

لنرى الآن كيف يمكننا استخدام متغيرات فصلنا في البرنامج (أي في الطريقة الرئيسية لفئة البرنامج) ، إذا كانت فصلا الولاية والبرنامج في نفس المشروع:

Class Program (static void Main (string args) (State state1 = new State ()؛ // لن نتمكن من تعيين القيمة إلى defaultVar المتغير ، // نظرًا لأنه يحتوي على معدل خاص ولا ترى فئة البرنامج it // وستقوم البيئة بالتسطير على أنها state1.defaultVar خاطئة = 5 ؛ // خطأ ، لا يمكنك الوصول // وينطبق الشيء نفسه على متغير privateVar state1.privateVar = 5 ؛ // خطأ ، لا يمكنك الوصول // تعيين لن تعمل قيمة المتغير protectedPrivateVar ، // نظرًا لأن فئة البرنامج ليست فئة فرعية من فئة State1.protectedPrivateVar = 5 ؛ // خطأ ، لا يمكنك الحصول على الوصول // تعيين قيمة المتغير المحمي ستفشل أيضًا ، // نظرًا لأن فئة البرنامج ليست فئة فرعية من فئة State1.protectedVar = 5 ؛ // خطأ ، لا يمكنك الوصول // المتغير الداخلي مع المعدّل الداخلي يمكن الوصول إليه من أي مكان في المشروع الحالي // لذلك ، قم بتعيينها بأمان القيمة state1.internalVar = 5 ؛ // يمكن الوصول إلى المتغير protectedInternalVar أيضًا من أي مكان في حالة المشروع الحالية1.protectedInternalVar = 5 ؛ // publicVar متاحة للجمهور state1.publicVar = 5 ؛ ))

وبالتالي ، تمكنا من تعيين المتغيرات InternalVar و protectedInternalVar و publicVar ، لأن معدِّلاتها تسمح لنا باستخدامها في هذا السياق.

الوضع مشابه للطرق:

برنامج الفصل (ثابت باطل رئيسي (سلسلة args) (State state1 = new State () ؛ state1.defaultMethod () ؛ // خطأ ، لا يمكن الوصول إليه state1.privateMethod () ؛ // خطأ ، لا يمكن الوصول إليه state1.protectedPrivateMethod () ؛ // خطأ ، لا يمكنك الوصول إلى state1.protectedMethod () ؛ // خطأ ، لا يمكنك الوصول إلى state1.internalMethod () ؛ // معايير state1.protectedInternalMethod () ؛ // معايير state1.publicMethod () ؛ // معايير ))

هنا ، كانت هناك ثلاث طرق متاحة لنا فقط: InternalMethod ، و protectedInternalMethod ، و publicMethod ، والتي تحتوي على المُعدِّلات الداخلية والمحمية والمعدِّلات العامة ، على التوالي.

بفضل نظام معدّلات الوصول هذا ، من الممكن إخفاء بعض جوانب تطبيق الفصل عن أجزاء أخرى من البرنامج.

على الرغم من حقيقة أن الجمهور والمعدلين الداخليين متشابهين في عملهم ، إلا أن لديهم فرقًا كبيرًا. ستكون الفصول الدراسية وأعضاء الفصل مع المُعدِّل العام متاحة أيضًا للبرامج الأخرى إذا تم وضع الفصل المعين في مكتبة dll الديناميكية ثم استخدامها في هذه البرامج.



هل أعجبك المقال؟ أنشرها