الانتقال الفرعيّ Delegation في Kotlin

من موسوعة حسوب
< Kotlin
مراجعة 17:00، 12 مارس 2018 بواسطة Nourtam (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:الانتقال الفرعيّ Delegation في Kotlin}}</noinclude> أثبت نموذج الانتقال الفرعيّ فعّاليته كب...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

أثبت نموذج الانتقال الفرعيّ فعّاليته كبديلٍ جيّدٍ عن وراثة تعريف الاستخدام (implementation inheritance) إذ تدعم لغة Kotlin هذه الميّزة مما بشكل طبيعيّ دون الحاجة إلى أيّ نوع قياسيّ من الشيفرات، وبالتالي فإنّ الصنف المُشتقّ (Derived) يرِث من الواجهة (Base) وينقل فرعيًا (delegate) كلَّ توابعه العامّة (public methods) إلى كائنٍ مُحدَّدٍ، كما في الشيفرة الآتية:

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
    val b = BaseImpl(10)
    Derived(b).print() // سيطبع القيمة 10
}

إذ إنّ عبارة by في قائمة النوع الأعلى (supertype) للصنف Derived تفيد بأنّ المتحول b سيُخزَّن داخليًا في كائنات الصنف Derived ، وسيُولِّد المترجِم (compiler) كافَّة التوابع الموجودة في Base والتي ستوجَّه للمتحول b.

وتبقى إعادة التعريف (override) فعّالةً لأن المُترجِم سيستخدِم إعادة تعريف الاستخدام (override implementations) الموجودة بدلًا من تلك المنقولة فرعيًّا للكائن؛ أيّ إذا أضفنا إعادة التعريف: override fun print() { print("abc") }‎ للصنف Derived فستظهر العبارة "abc" بدلًا من القيمة "10".

مصادر