יצירת מנוע טווח קוטלין על אובייקט מותאם אישית

1. הקדמה

במאמר קודם הראינו כיצד אנו יכולים ליצור טווח בקוטלין וכמה קל לחזור עליו Int, Long ו לְהַשְׁחִיר סוגים.

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

2. סוג צבעוני

בואו נדמיין שיש לנו מחלקה פשוטה המייצגת צבע RGB:

class CustomColor (val rgb: Int): השוואה {} 

זה יהיה נחמד להיות מסוגל לחזור על מגוון צבעי RGB:

val a = CustomColor (0x000000) val b = CustomColor (0xCCCCCC) עבור (cc ב- a..b) {// לעשות דברים}

3. מבט מהיר על IntRange

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

עבור שני הממשקים האחרים, בואו נצלול לתוך ה- IntRange הצהרת כיתה למספר רמזים:

כיתה ציבורית IntRange (התחלה: Int, endInclusive: Int): IntProgression (start, endInclusive, 1), ClosedRange 

ואז, אינטגרציהההצהרה מראה שהיא מיישמת נידון:

מעמד פתוח ציבורי IntPgression: Iterable

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

4. טווח צבעים מעמד

כמו IntRange, בואו ניצור a טווח צבעים מעמד.

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

class ColorRange (עקיפת התחלת ערך: CustomColor, עקיפת val endInclusive: CustomColor): ClosedRange, Iterable {עקיפת איטרטור מהנה (): Iterator {החזרת ColorIterator (start, endInclusive)}}

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

כי טווח צבעים מיישם את סגור ממשק, עלינו ליישם את בהשוואה ל שיטה ב CustomColor מעמד:

לעקוף כיף CompareTo (אחר: CustomColor): Int {להחזיר this.rgb.compareTo (other.rgb)}

5. ColorIterator מעמד

ColorIterator היא היצירה האחרונה של הפאזל:

class ColorIterator (val start: CustomColor, val endInclusive: CustomColor): Iterator {var initValue = start override fun hasNext (): Boolean {return initValue <= endInclusive} override fun next (): CustomColor {return initValue ++}}

ציין זאת initValue הוא מסוג CustomColor. אז, כדי לשנות את זה עם ++ נצטרך להוסיף את inc () שיטה ל CustomColor גם כן:

fun fun inc (): CustomColor {החזר CustomColor (rgb + 1)}

6. שימוש בטווח המותאם אישית

אנחנו כמעט שם!

מכיוון שאנו מגדירים את הטווח המותאם אישית שלנו, CustomColor המחלקה חייבת ליישם את טווח אל שיטה. ה טווח אל השיטה תאפשר לנו לחזור על הטווח שלנו באמצעות .. מַפעִילבערך כמו להוסיף inc מאפשר לנו להשתמש ב- ++ מַפעִיל.

בואו לבדוק את המוצר הסופי:

class CustomColor (val rgb: Int): Comparable {override fun comparTo (other: CustomColor): Int {return this.rgb.compareTo (other.rgb)} fun fun rangeTo (that: CustomColor) = ColorRange (this, that) operator fun inc (): CustomColor {החזר CustomColor (rgb + 1)}}

וזה כל מה שאנחנו צריכים!

לבסוף, בואו נראה איך כל זה עובד יחד, מאת באמצעות מגוון של שלנו CustomColor מעמד:

@Test fun assertHas10Colors () {assertTrue {val a = CustomColor (1) val b = CustomColor (10) val range = a..b for (cc in range) {println (cc)} range.toList (). Size = = 10}}

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

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

@Test fun assertContains0xCCCCCC () {assertTrue {val a = CustomColor (0xBBBBBB) val b = CustomColor (0xDDDDDD) range val = a..b range.contains (CustomColor (0xCCCCCC))}}

7. מסקנה

Kotlin יש יישום מקומי של טווח עבור Int, Long ו לְהַשְׁחִיר ערכים. במאמר זה למדנו כיצד ליישם טווח בשיעור מותאם אישית.

כמו תמיד, הקוד זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found