Sobes.tech
Junior

როგორ არის ორგანიზებული მემკვიდრეობა და პოლიმორფიზმი Kotlin-ში?

sobes.tech AI

პასუხი AI-სგან

Կոտլինում ժառանգությունը իրականացնում է դասերի և ինտերֆեյսների մեխանիզմների միջոցով: Դասերը կարող են ժառանգել միայն մեկ այլ դաս (միայնակ ժառանգություն), բայց կարող են իրականացնել մի քանի ինտերֆեյսներ:

Նախնական կարգով, բոլոր դասերը Kotlin-ում 'վերջնական' են, այսինքն՝ ժառանգել հնարավոր չէ: Ժառանգությունը թույլ տալու համար, դասը պետք է հստակ նշվի open բանալի բառով:

Դասերի ժառանգություն:

open class Shape { // Բազային դաս, նշված որպես open
    open fun draw() { // Մեթոդ, որը կարող է վերաշարադրվել
        println("Drawing a shape")
    }
}

class Circle : Shape() { // ժառանգում է Shape-ից
    override fun draw() { // Վերաշարադրում է մեթոդը
        println("Drawing a circle")
    }
}

Ներածության կոնստրուկտորում անհրաժեշտ է հստակ կամ անուղղակի կերպով կանչել բազային դասի կոնստրուկտորը:

Ինտերֆեյսներ:

Կոտլինում, ինտերֆեյսները նման են Java 8-ի ինտերֆեյսներին և կարող են պարունակել աբստրակտ մեթոդներ և իրականացված մեթոդներ մարմնով:

interface Drawable {
    fun draw() // Աբստրակտ մեթոդ
    fun description() { // Մեթոդ, որը ունի նախնական իրականացում
        println("This is a drawable object")
    }
}

class Square : Drawable {
    override fun draw() { // Վերաշարադրում է աբստրակտ մեթոդը
        println("Drawing a square")
    }
    // description() կարող է վերաշարադրվել, բայց դա պարտադիր չէ
}

Պոլիմորֆիզմ:

Կոտլինում, պոլիմորֆիզմը հասնում է այն միջոցով, որ կարող եք աշխատել տարբեր դասերի օբյեկտների հետ ընդհանուր բազային տիպի (դաս կամ ինտերֆեյս) միջոցով:

fun render(drawable: Drawable) {
    drawable.draw() // Կոչում է draw() մեթոդը իրական տիպի վրա
    drawable.description()
}

fun main() {
    val circle: Shape = Circle() // Օբյեկտը դիտվում է որպես Shape
    circle.draw() // Կոչում է draw() մեթոդը՝ պոլիմորֆիզմի պատճառով

    val square: Drawable = Square() // Օբյեկտը դիտվում է որպես Drawable
    render(square) // Կոչում է draw() և description() մեթոդները Square-ից
}

Այս օրինակով, render աշխատում է ցանկացած օբյեկտի հետ, որը իրականացնում է Drawable-ին:

drawable.draw() կոչը կիրականացնի draw մեթոդի իրականացմանը կոնկրետ տիպի համար (Square):

Դասերի ժառանգության և ինտերֆեյսների իրականացման տարբերությունը:

  • Դասի ժառանգություն: սահմանում է "է" (is-a) հարաբերություն: Որդեգրված դասը ժառանգում է բազային դասի վիճակն ու վարքագիծը:

  • Ինտերֆեյսի իրականացում: սահմանում է "համակարգ" կամ "պայմանագիր": Դասը խոստանում է տրամադրել բոլոր աբստրակտ մեթոդների իրականացումը:

Համեմատական աղյուսակ:

Գծանշում Դասի ժառանգություն Ինտերֆեյսի իրականացում
Կապի տեսակ is-a Հնարավորություն / Պայմանագիր
Բազմակիություն Միայնակ Բազմակի
Կարգավիճակ ժառանգում է բազային դասի վիճակը Չի ժառանգում վիճակ
Մեթոդների իրականացում Կարող է պարունակել իրականացում Կարող է պարունակել նախնական իրականացում (Java 8-ից)