السلام عليكم ماذا تعني public في كوتلن؟
ماذا تعني public و protected وinternal و private?
في برمجة الكوتلن ارجو التوضيح مع امثلة
وشكراً
في لغة البرمجة Kotlin، تعني public أن العنصر (مثل الفئة أو الدالة أو المتغير) يمكن الوصول إليه من أي مكان في الكود ، سواء كان داخل نفس الوحدة (module) أو خارجها. يمكن لأي كائن في الكود الوصول إلى العنصر العام (public) واستخدامه.
أما بالنسبة للكلمات المفتاحية الأخرى المستخدمة في البرمجة (protected و internal و private)، فهي تشير إلى مستويات وصول مختلفة للعناصر في الكود، وتستخدم لتحديد القدرة على الوصول إلى العنصر من قبل كائنات أخرى في الكود.
open class Person { protected val name: String = "Ahmed" } class Employee : Person() { fun printName() { println(name) // يمكن استخدام الخاصية المحمية هنا في الفئة المشتقة } }
internal fun doSomething() { // يمكن استخدام هذه الدالة داخل الوحدة الحالية فقط }
class Person { private val age: Int = 25 fun printAge() { println(age) // يمكن استخدام الخاصية الخاصة هنا في نفس الفئة فقط } }
وبالإمكان استخدام هذه المفاتيح لتحديد مستويات وصول العناصر في الكود وحمايتها من الوصول غير المرغوب فيه.
تم شرح هذه الكلمات المفتاحية بشكل ممتاز في التعليق السابق
وفيما يلي بعض الأمثلة لتوضيح استخدام هذه الكلمات المفتاحية في لغة الكوتلن:
class Car(public val model: String, public val year: Int) { fun drive() { println("Driving $model") } } val car = Car("Toyota Camry", 2022) println(car.model) // سيطبع "Toyota Camry" car.drive() // سيطبع "Driving Toyota Camry"
في هذا المثال، تم إنشاء صنف Car وتم تعريف خاصية model و year كـ public، وهذا يعني أنه يمكن الوصول إليهما من أي مكان في الكود.
open class Vehicle(protected val brand: String) { fun honk() { println("Honking the $brand") } } class Car(brand: String) : Vehicle(brand) { fun drive() { println("Driving the $brand car") } } val car = Car("Toyota") car.honk() // سيطبع "Honking the Toyota" car.drive() // سيطبع "Driving the Toyota car"
في هذا المثال، تم إنشاء صنف Vehicle وتم تعريف خاصية brand كـ protected، وهذا يعني أنه يمكن الوصول إليها من داخل الصف Vehicle والصفات التي تورث منه فقط. وتم إنشاء صنف Car والذي يورث من Vehicle وبالتالي يمكنه الوصول إلى خاصية brand.
internal class Car(val model: String) { fun drive() { println("Driving the $model car") } } val car = Car("Toyota Camry") car.drive() // سيطبع "Driving the Toyota Camry car"
في هذا المثال، تم إنشاء صنف Car وتم تعريفه بـ internal، وهذا يعني أنه يمكن الوصول إليه من داخل نفس الـ module الذي تم إنشاؤه.
class Car(val model: String) { private var fuel = 0 fun drive() { if (fuel > 0) { fuel-- println("Driving the $model car") } else { println("No fuel!") } } fun addFuel(amount: Int) { fuel += amount } } val car = Car("Toyota Camry") car.addFuel(5) car.drive() // سيطبع "Driving the Toyota Camry
وفي المثال السابق، تم إنشاء صنف Car وتم تعريف خاصية fuel كـ private، وهذا يعني أنه يمكن الوصول إليها فقط من داخل الصنف نفسه، ولا يمكن الوصول إليها من خارج الصنف. وتم إنشاء دالتين داخل الصنف، دالة drive ودالة addFuel، وتم استخدام خاصية fuel داخل دالة drive ودالة addFuel. وبسبب تعريف خاصية fuel كـ private، فإنه لا يمكن الوصول إليها من خارج الصنف ويتم التعامل معها فقط من داخل الصنف.
هذه المصطلحات تستخدم في البرمجة الكائنية (OOP) وتحديداً في لغة الكوتلن لتحديد مستوى الوصول للحقول والدوال في الكلاسات وقد تمثل اهمية كبيرة في تعديل سلوك واستخدام الكلاسات التي تم تحديدها.
1. "public": هو أعلى مستوى للوصول في الكوتلن، ويعني أن العنصر المعرف بهذه الكلمة يمكن الوصول إليه من أي كود خارج نطاق الكلاس، بمعنى آخر فإن الكلمة public تسمح بتحديد واستخدام العناصر الخاصة بالكلاس من أي كلاس أو أي جزء آخر من البرنامج.
مثال:
class Person { public var name: String = "" fun sayHello() { println("Hello, my name is $name") } } fun main(args: Array<String>) { val person = Person() person.name = "John" person.sayHello() }
في هذا المثال، يمكن الوصول إلى الحقل "name" ودالة "sayHello" من كود خارجي للكلاس "Person".
2. "protected": هو مستوى الوصول المتوسط في الكوتلن، ويعني أن هذه الدوال والحقول يمكن الوصول إليها من داخل الكلاس نفسه أو من داخل الكلاسات الموروثة منه فحسب، ولكن لا يمكن الوصول إليها من أي كود خارجي للكلاس.
مثال:
open class Person { protected var name: String = "" } class Student : Person() { fun changeName(newName: String) { name = newName } } fun main(args: Array<String>) { val student = Student() student.changeName("John") }
في هذا المثال، يمكن الوصول إلى الحقل "name" من داخل الكلاس "Person" وكلاس الموروث منه "Student"، لكنه غير متاح لأي كود خارجي للكلاس.
3. "internal": هو مستوى الوصول الافتراضي في الكوتلن، ويمكن الوصول إليه من داخل الفايل الذي يحتوي عليه (module) نفسه، ولكن لا يمكن الوصول إليه من أي ملف خارج نطاق الموديول.
مثال:
// ModuleA.kt internal var name: String = "John" // ModuleB.kt fun printName() { println(name) } fun main(args: Array<String>) { printName() // compile error }
في هذا المثال، يمكن الوصول إلى الحقل "name" من أي كود داخل الفايل الذي يحتوي عليه، ولكن لا يمكن الوصول إليه من كود خارجي للموديول.
4. "private": هو أدنى مستوى للوصول في الكوتلن، يعني تجريد الوصول الى العناصر المعرفة للنطاق الخاص. بمعنى آخر ، لا يمكن الوصول إلى أي متغيرات أو دوال المعرفة كخاص بشكل مباشر من خارج النطاق الذي يمكن تجريده.
مثال:
class Person(private var name: String, private var age: Int) { fun getInfo(): String { return "الاسم: $name, العمر: $age" } private fun isAdult(): Boolean { return age >= 18 } fun checkAge(): String { return if (isAdult()) "العمر كافِّ للتصرف" else "العمر غير كافٍ للتصرف" } } fun main() { val person = Person("محمد", 28) println(person.getInfo()) println(person.checkAge()) }
في هذا المثال، تم تعريف الكلاس "Person" مع المتغيرات الخاصة "name" و "age". لا يمكن الوصول إلى هذين المتغيرين من خارج الكلاس بشكل مباشر. تم كذلك تعريف دالة "isAdult" كخاص، لذلك فإنه لا يمكن الوصول إليها من خارج الكلاس أيضا.
تم استخدام الدالة الخاصة "isAdult" داخل دالة "checkAge" لتحقق من صحة الشروط، وتعيد النص المناسب. يمكن الوصول إليها من "checkAge" لأن كلا الدالتين (checkAge و isAdult) تعودان إلى نفس الكلاس.
في الدالة "getInfo" يمكن استخدام المتغيرات الخاصة "name" و "age" بشكل مباشر وذلك لأنهما تم تعريفهما كخاص وداخل الكلاس نفسه.
الاستخدام السليم ل private يساعد على إبقاء الكود آمنا ومنظَّماً، ويمنع الاختراقات والأخطاء غير المقصودة.
التعليقات