Menu
Coddy logo textTech

בנאים משניים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין