Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

المنشئات الثانوية

جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 5 من 57.

يمكن للفئة توفير طرق إضافية لإنشائها باستخدام المنشئات الثانوية، المُعلنة باستخدام constructor. يجب أن يستدعي كل منها المنشئ الأساسي باستخدام this(...):

class Temperature(val celsius: Double) {
    constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}

داخل main:

println(Temperature(20.0).celsius)
println(Temperature(212).celsius)

الناتج:

20.0
100.0

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

class Color(val r: Int, val g: Int, val b: Int) {
    constructor(gray: Int) : this(gray, gray, gray)
    constructor(hex: String) : this(hex.substring(0, 2).toInt(16), hex.substring(2, 4).toInt(16), hex.substring(4, 6).toInt(16))

    fun label() = "rgb($r, $g, $b)"
}

داخل main:

println(Color(128).label())
println(Color("FF8000").label())

الناتج:

rgb(128, 128, 128)
rgb(255, 128, 0)

يتم تشغيل المُنشئ الأساسي وكتل init الخاصة به أولًا، ثم جسم المُنشئ الثانوي:

class Log(val name: String) {
    init { println("primary: $name") }
    constructor(id: Int) : this("log-$id") {
        println("secondary: $id")
    }
}

داخل main:

Log(7)

الناتج:

primary: log-7
secondary: 7

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

class Size(val w: Int, val h: Int) {
    constructor(side: Int) : this(side, side)   // Size(3) -> مربع
    // constructor(w: Int) : this(w, 1)        // خطأ: نفس التوقيع كما أعلاه
}
challenge icon

التحدي

سهل

أكمل الصنف Duration(val seconds: Int) باستخدام مُنشئ ثانوي (minutes: Int, seconds: Int) وآخر يستقبل نصًا مثل 1:30 أو 2:05:10 (الساعات:الدقائق:الثواني). أضف format()، الذي يعيد h:mm:ss مع عرض الدقائق والثواني برقمين.

يقرأ الكود المزوَّد المدد كنصوص تحتوي على نقطتين أو نقطة أو نقطتين، وينشئ كل مدة باستخدام مُنشئ النص ويطبع format()، ثم يطبع total والمجموع المنسَّق.

ضع الكود الخاص بك في Duration.kt. يحتوي Main.kt على كود الإدخال/الإخراج المزوَّد ولا يمكن تعديله.

جرّب بنفسك

fun main() {
    // كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
    val input = generateSequence(::readLine).toList()
    var total = 0
    for (line in input) {
        val d = Duration(line)
        println(d.format())
        total += d.seconds
    }
    println("total " + Duration(total).format())
}
quiz iconاختبر نفسك

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

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

تدرّب بنفسك: Playground لـ Kotlin