Kotlin מקוננות ושיעורים פנימיים

1. הקדמה

במדריך זה נבחן ארבע דרכים ליצור שיעורים מקוננים ופנימיים בקוטלין.

2. השוואה מהירה לג'אווה

לאלו שחושבים על שיעורים מקוננים ב- Java, בואו נסקור במהירות את המונחים הקשורים:

קוטליןג'אווה
שיעורים פנימייםכיתות מקוננות לא סטטיות
שיעורים מקומייםשיעורים מקומיים
חפצים אנונימייםשיעורים אנונימיים
שיעורים מקונניםכיתות מקוננות סטטיות

אמנם בהחלט לא זהה, אך אנו יכולים להשתמש בטבלה זו כמדריך כאשר אנו חושבים על היכולות ומשתמשים בכל אחד מהם.

3. שיעורים פנימיים

ראשית, אנו יכולים להכריז על כיתה בתוך כיתה אחרת באמצעות מילת המפתח פְּנִימִי.

שיעורים אלה יש גישה לחברי הכיתה הסוגרת, אפילו לחברים פרטיים.

כדי להשתמש בו, עלינו ליצור מופע של המעמד החיצוני תחילה; איננו יכולים להשתמש בשיעורים פנימיים בלעדיו.

בואו ניצור דיסק קשיח מעמד פנימי בתוך א מַחשֵׁב מעמד:

מחשב מחלקה (דגם val: מחרוזת) {מחלקה פנימית HardDisk (val sizeInGb: Int) {fun getInfo () = "מותקן ב- $ {[מוגן באמצעות דוא"ל]} עם $ sizeInGb GB"}}

שים לב שאנחנו משתמשים בביטוי זה כדי לגשת לחברים ב- מַחשֵׁב בכיתה, הדומה למצב שאנחנו עושים זאת מחשב. זה במקבילה של Java דיסק קשיח.

עכשיו בואו נראה את זה בפעולה:

@Test fun givenHardDisk_whenGetInfo_thenGetComputerModelAndDiskSizeInGb () {val hardDisk = Computer ("Desktop"). HardDisk (1000) assertThat (hardDisk.getInfo ()) .isEqualTo ("מותקן במחשב (דגם = שולחן עבודה) עם 1000 GB")}

4. שיעורים פנימיים מקומיים

לאחר מכן, אנו יכולים להגדיר מחלקה בתוך גוף השיטה או בגוש היקף.

בואו נעשה דוגמה מהירה כדי לראות איך זה עובד.

ראשית, נגדיר א פועל שיטה עבור שלנו מַחשֵׁב מעמד:

powerOn כיף (): מחרוזת {// ...}

בפנים פועל שיטה בואו נכריז א לד בכיתה ותגרום לו למצמץ:

fun powerOn (): מחרוזת {class Led (צבע val: מחרוזת) {fun flash (): מחרוזת {return "מהבהב $ color"}} val powerLed = Led ("ירוק") return powerLed.blink ()}

שים לב שהיקף ה- לד הכיתה היא רק בתוך השיטה.

בעזרת מחלקות פנימיות מקומיות, אנו יכולים לגשת ולשנות משתנים המוצהרים בהיקף החיצוני. בואו נוסיף a defaultColor בתוך ה פועל שיטה:

כיף powerOn (): מחרוזת {var defaultColor = "כחול" // ...} 

עכשיו, בואו נוסיף a changeDefaultPowerOnColor בשלנו לד מעמד:

class Led (val color: String) {// ... fun changeDefaultPowerOnColor () {defaultColor = "Violet"}} val powerLed = Led ("Green") log.debug ("defaultColor is $ defaultColor") powerLed.changeDefaultPowerOnColor ( ) log.debug ("defaultColor השתנה בתוך מחלקת Led" + "ל- $ defaultColor")

אילו תפוקות:

[main] DEBUG c.b.n.Computer - defaultColor is Blue [main] DEBUG c.b.n.Computer - defaultColor שונה בתוך מחלקת Led לסגול

5. חפצים אנונימיים

ניתן להשתמש באובייקטים אנונימיים כדי להגדיר יישום של ממשק או מחלקה מופשטת מבלי ליצור יישום רב פעמי.

הבדל גדול בין אובייקטים אנונימיים בקוטלין לשיעורים פנימיים אנונימיים בג'אווה הוא זה אובייקטים אנונימיים יכולים ליישם ממשקים ושיטות מרובים.

ראשית, בואו נוסיף a מחליף ממשק שלנו מַחשֵׁב מעמד:

ממשק מתג {fun on (): String}

עכשיו, בואו נוסיף יישום של ממשק זה בתוך ה- פועל שיטה:

fun powerOn (): String {// ... val powerSwitch = object: Switcher {override fun on (): String {return powerLed.blink ()}} return powerSwitch.on ()}

כפי שאנחנו יכולים לראות, להגדיר את האנונימי שלנו מתג הפעלה אובייקט אנו משתמשים בביטוי אובייקט. כמו כן, עלינו לקחת בחשבון שבכל פעם שמופעל ביטוי האובייקט נוצר מופע חדש של האובייקט.

עם אובייקטים אנונימיים כמו מחלקות פנימיות, אנו יכולים לשנות משתנים שהוכרזו בעבר בתחום. הסיבה לכך היא שלקוטלין אין את המגבלה הסופית שאליה ציפינו בג'אווה.

עכשיו, בואו נוסיף a changeDefaultPowerOnColor בשלנו מתג הפעלה התנגד וקרא לזה:

val powerSwitch = אובייקט: Switcher {// ... fun changeDefaultPowerOnColor () {defaultColor = "צהוב"}} powerSwitch.changeDefaultPowerOnColor () log.debug ("defaultColor השתנה בתוך powerSwitch" + "אובייקט אנונימי ל- $ defaultColor")

נראה פלט כזה:

... [ראשי] DEBUG c.b.n. מחשב - ברירת מחדל צבע השתנה בתוך כוח העבר אובייקט אנונימי לצהוב

כמו כן, שים לב שאם האובייקט שלנו הוא מופע של ממשק או מחלקה בשיטה מופשטת אחת; אנו יכולים ליצור אותו באמצעות ביטוי למבדה.

6. שיעורים מקוננים

ואחרון, אנו יכולים להגדיר כיתה בתוך כיתה אחרת לְלֹא מילת המפתח הפנימית:

מחשב מחלקה (דגם val: מחרוזת) {class MotherBoard (יצרן val: String)}

בסוג זה של מחלקות אין לנו גישה למופע המעמד החיצוני. אבל, אנחנו יכולים לגשת אובייקט נלווה חברי הכיתה הסוגרת.

אז בואו נגדיר א אובייקט נלווה בתוך שלנו מַחשֵׁב בכיתה לראות את זה:

אובייקט נלווה {const val originCountry = "China" כיף getBuiltDate (): מחרוזת {return "2018-07-15T01: 44: 25.38Z"}}

ואז שיטה בפנים האם לקבל מידע אודותיו והמעמד החיצוני:

כיף getInfo () = "מיוצר על ידי $ יצרן - $ originCountry - $ {getBuiltDate ()}"

כעת נוכל לבדוק זאת כדי לראות כיצד זה עובד:

@Test fun givenMotherboard_whenGetInfo_thenGetInstalledAndBuiltDetails () {val motherBoard = Computer.MotherBoard ("MotherBoard Inc.") assertThat (motherBoard.getInfo ()) .isEqualTo ("תוצרת MotherBoard Inc. מותקן בסין - 2018-05-23")}

כפי שאנו רואים, אנו יוצרים האם ללא מופע של מַחשֵׁב מעמד.

7. מסקנה

במאמר זה, ראינו כיצד להגדיר ולהשתמש בשיעורים מקוננים ופנימיים בקוטלין כדי להפוך את הקוד שלנו לתמציתי ומורכז יותר.

כמו כן, ראינו כמה קווי דמיון למושגי Java המתאימים.

דוגמה עובדת במלואה עבור מדריך זה ניתן למצוא באתר GitHub.