דפוס משלחת בקוטלין

1. סקירה כללית

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

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

2. יישום

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

ממשק מפיק {כיף לייצר (): מחרוזת} מחלקה ProducerImpl: מפיק {לעקוף תוצרת כיף () = "ProducerImpl"}

הַבָּא, בואו נקשט את היישום הקייםבאמצעות מילת המפתח "לפי" והוסף את העיבוד הדרוש הנוסף:

class EnhancedProducer (נציג val פרטי: מפיק): מפיק על ידי נציג {override fun produce () = "$ {delegate.produce ()} ו- EnhancedProducer"}

לכן, בדוגמה זו ציינו כי ה- EnhancedProducer בכיתה יקיף א נָצִיג אובייקט מהסוג יַצרָן. והוא יכול גם להשתמש בפונקציונליות מה- יַצרָן יישום.

לבסוף, בואו נוודא שזה עובד כצפוי:

producer producer = EnhancedProducer (ProducerImpl ()) assertThat (producer.produce ()). isEqualTo ("ProducerImpl ו- EnhancedProducer")

3. השתמש במקרים

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

ראשית, נוכל להשתמש בתבנית המשלחת ליישום ממשקים מרובים באמצעות יישומים קיימים:

class CompositeService: UserService by UserServiceImpl (), MessageService by MessageServiceImpl ()

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

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

מחלקה SynchronizedProducer (נציג val פרטי: מפיק): מפיק על ידי נציג {lock private val = ReentrantLock () לעקוף תוצרת מהנה (): String {lock.withLock {return delegate.produce ()}}}

4. משלחת אינה ירושה

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

הבה נבחן דוגמה:

ממשק שירות {val seed: Int fun serve (action: (Int) -> Unit)} class ServiceImpl: Service {override val seed = 1 override fun serve (action: (Int) -> Unit) {action (seed)}} class ServiceDecorator: Service by ServiceImpl () {override val seed = 2}

הנה, הנציג (ServiceImpl) משתמש במאפיין שהוגדר בממשק המשותף, ואנחנו עוקפים אותו במעצב (ServiceDecorator). עם זאת, זה לא משפיע על עיבוד הנציג:

שירות val = ServiceDecorator () service.serve {assertThat (it) .isEqualTo (1)}

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

5. מסקנה

במדריך זה דיברנו על האצלת ממשק Kotlin - מתי יש להשתמש בו, כיצד להגדיר אותו, ואזהרותיו.

כרגיל, קוד המקור השלם למאמר זה זמין באתר GitHub.


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