English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
محدد الوصول في Scala مشابه لـ Java، ويتمثل في: private،protected،public.
إذا لم يتم تحديد محدد الوصول، فإن مستوى الوصول الافتراضي لكلاء Scala هو public.
محدد الوصول private في Scala أكثر صرامة من Java، وفي حالة الكلاسات المدمجة، لا يمكن للكلاس الخارجي الوصول إلى الأعضاء الخاصة للكلاس المدمج.
باستخدام كلمة المفتاح private، الأعضاء المزودة بهذا العلامة مرئية فقط داخل الكائن أو الكلاس الذي يحتوي على تعريف العضو، والنظام نفسه ينطبق أيضًا على الكلاسات الداخلية.
class Outer{ class Inner{ private def f(){ println("f") } class InnerMost{ f() // صحيح } } (new Inner).f() // خطأ }
غير قانوني الوصول إلى (new Inner).f() لأن f تم تعريفها كـ private في Inner، ولم يتم الوصول إليها داخل الفئة Inner.
لكن في InnerMost. f لا مشكلة في هذا الوصول لأنه يتضمن داخل الفئة Inner.
يسمح Java بهذين النوعين من الوصول لأنه يسمح للفئات الخارجية الوصول إلى الأعضاء الخاصة للفئات الداخلية.
في Scala، يكون الوصول إلى الأعضاء المحميتة (Protected) أكثر صرامة من Java. لأنه يسمح للأعضاء المحميين بالوصول فقط إلى الفئات الفرعية للفئة التي تم تعريف الأعضاء فيها. بينما في Java، يمكن الوصول إلى الأعضاء المحميين باستخدام كلمة المفتاح protected، إلى الفئات الفرعية للفئة التي تم تعريف الأعضاء فيها وكذلك إلى الفئات الأخرى في نفس الحزمة.
package p{ class Super{ protected def f() { println("f") } } class Sub extends Super{ f() } class Other{ (new Super).f() // خطأ } }
في المثال السابق، لم يكن هناك مشكلة في الوصول إلى f من قبل Sub، لأن f تم تخصيصه كـ protected في Super، وSub هو فرع من Super. عكس ذلك، لا يمكن الوصول إلى f من قبل Other، لأن Other لم يرث من Super. ومع ذلك، يتم الاعتراف بهذا في Java أيضًا، لأن Other وSub في نفس الحزمة.
في Scala، إذا لم يتم تحديد أي وسيط وصول، فإنه يتم افتراض public. يمكن الوصول إلى هذا العضو في أي مكان.
class Outer { class Inner { def f() { println("f") } class InnerMost { f() // صحيح } } (new Inner).f() // صحيح لأن f() هو public }
في Scala، يمكن استخدام التكميلات لتقديم التأكيد على وسيط الوصول. تنسيقها هو:
private[x] أو protected[x]
هناك x يشير إلى حزمة أو فئة أو عميل وحيد معين. إذا كتبت كـ private[x]، فإنها تُقرأ "هذا العضو غير مرئي للآخرين سوى الفئات أو الحزم في [...] أو الفئات في [...] وكذلك لكل منهم من الأشخاص المرافقين، ولكن للآخرين غيرهم.
هذه التقنية مفيدة جدًا في المشاريع الكبيرة التي تتجاوز عدة حزم، حيث تسمح لك بتعريف بعض الأشياء التي تكون مرئية في بعض حزم مشاريعك ولكنها غير مرئية دائمًا للعملاء الخارجيين.
package bobsrockets{ package navigation{ private[bobsrockets] class Navigator{ protected[navigation] def useStarChart(){} class LegOfJourney{ private[Navigator] val distance = 100 } private[this] var speed = 200 } } package launch{ import navigation._ object Vehicle{ private[launch] val guide = new Navigator } } }
في المثال السابق، يتم وضع علامة private[bobsrockets] على فئة Navigator، مما يعني أن هذه الفئة مرئية لجميع الفئات والأشياء الموجودة في حزمة bobsrockets.
على سبيل المثال، يتم السماح بالوصول إلى Navigator من Object Vehicle لأن Object Vehicle يتضمن في الحزمة launch، والذي يتضمن في الحزمة bobsrockets، بينما لا يمكن للكود خارج حزمة bobsrockets الوصول إلى فئة Navigator.