المنشئات الثانوية
جزء من قسم البرمجة كائنية التوجه في رحلة 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) // خطأ: نفس التوقيع كما أعلاه
}التحدي
سهلأكمل الصنف 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())
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin