تعبيرات الكائنات
جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 15 من 57.
ينشئ تعبير الكائن كائنًا لمرة واحدة من فئة غير مُسمّاة، في المكان الذي تكون هناك حاجة إليه فيه. وتتم كتابته بالشكل object : Type { ... }، وعادةً ما ينفّذ واجهة. تسرد الواجهة الأساليب دون توضيح كيفية عملها؛ ويتناول الفصل 5 الواجهات بالتفصيل:
interface Greeter {
fun greet(name: String): String
}داخل main:
val polite = object : Greeter {
override fun greet(name: String) = "Good morning, $name."
}
println(polite.greet("Ada"))الناتج:
Good morning, Ada.يُوجد تصريح الكائن مرة واحدة. ويُقيَّم تعبير الكائن في كل مرة تُنفَّذ فيها شفرته، وينشئ كل تنفيذ كائنًا جديدًا. ويمكنه قراءة المتغيرات المحلية المحيطة به وتغييرها:
interface Counter {
fun next(): Int
}
fun counterFrom(start: Int): Counter {
var current = start
return object : Counter {
override fun next() = current++
}
}داخل main:
val a = counterFrom(10)
val b = counterFrom(1)
println("${a.next()} ${a.next()} ${b.next()}")الناتج:
10 11 1من الاستخدامات الشائعة تمرير سلوك إلى دالة مكتبة. تأخذ sortedWith كائنًا من نوع Comparator، وهي واجهة تُرجع طريقتها compare(a, b) عددًا سالبًا عندما يأتي a أولًا، وصفرًا عند التعادل، وعددًا موجبًا خلاف ذلك:
داخل main:
val words = listOf("kiwi", "fig", "banana", "apple")
val byLength = object : Comparator<String> {
override fun compare(a: String, b: String) = a.length - b.length
}
println(words.sortedWith(byLength))الناتج:
[fig, kiwi, apple, banana]يُجمّع تعبير الكائن من دون نوع فائق بعض القيم في كائن محلي؛ ويمكن استخدام خصائصه داخل الدالة نفسها. عندما تكون للواجهة طريقة واحدة، يكون تعبير lambda غالبًا أقصر من تعبير الكائن. تناسب تعبيرات الكائن الحالات التي توجد فيها عدة طرق أو بعض الحالة التي يجب الاحتفاظ بها.
val size = object {
val width = 3
val height = 4
}
println(size.width * size.height) // 12
val byLength = Comparator<String> { a, b -> a.length - b.length } // شكل لامداالتحدي
سهلتحتوي الواجهة Validator على طريقة واحدة، وهي check(text)، التي تُرجع رسالة خطأ أو null عندما يجتاز النص الاختبار. أكمل الدالة rules(minLength) بحيث تُرجع ثلاثة مُحقِّقات مُنشأة باستخدام تعبيرات الكائنات، بالترتيب التالي: يجب أن يحتوي النص على minLength حرفًا على الأقل (too short)، وأن يحتوي على رقم (needs a digit)، وألا يحتوي على مسافات (no spaces allowed).
يقرأ الكود المُزوَّد الحد الأدنى للطول، ثم كلمة مرور واحدة في كل سطر. ويطبع ok، أو كل رسالة خطأ تخص كلمة المرور، مع ضمّها باستخدام ; .
يجب أن تضع كودك في Rules.kt وValidator.kt. يحتوي Main.kt على كود الإدخال/الإخراج المُزوَّد، ولا يمكن تعديله.
جرّب بنفسك
fun main() {
// كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
val input = generateSequence(::readLine).toList()
val checks = rules(input[0].toInt())
for (password in input.drop(1)) {
val problems = checks.mapNotNull { it.check(password) }
println(if (problems.isEmpty()) "ok" else problems.joinToString("; "))
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفين3الكائنات والكائنات المرافقة
تعريفات الكائناتالكائنات المرافقةالثوابت باستخدام constتعبيرات الكائناتمراجعة - شباك التذاكرتدرّب بنفسك: Playground لـ Kotlin