როგორ არის ორგანიზებული მემკვიდრეობა და პოლიმორფიზმი 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-ից) |