Sobes.tech
Junior

Ներկայացրեք, թե ինչպես է աշխատում 'super' բանալի բառը Kotlin լեզվում։

sobes.tech AI

Պատասխան AI-ից

Բառային կետ super օգտագործվում է ծնողական դասի անդամներին (գույքագրումներին, մեթոդներին) հասնելու համար դուստր դասից:

Հիմնական օգտագործման տարբերակները:

  1. Ծնող դասի կոնստրուկտորին կանչել: Սովորաբար օգտագործվում է դուստր դասի կոնստրուկտորում՝ համապատասխան ծնողական կոնստրուկտորին կանչելու համար: Դա պայմանական է, եթե ծնողական դասը ունի հիմնական կոնստրուկտոր պարամետրերով:

    open class Parent(val name: String)
    
    class Child(name: String) : Parent(name) {
        // Child-ի կոնստրուկտորը կանչում է Parent-ի կոնստրուկտորը,
        // փոխանցելով name պարամետրը:
    }
    
  2. Ծնող դասի անդամներին հասնել, որոնք վերաշարադրված են դուստր դասում: Հնարավոր է դիմել ծնողական դասի մեթոդի կամ գույքագրումի իրականացմանը, նույնիսկ եթե դրանք վերաշարադրված են (օգտագործելով override) դուստր դասում:

    open class Base {
        open fun greet() {
            println("Hello from Base")
        }
    
        open val value: Int = 1
    }
    
    class Derived : Base() {
        override fun greet() {
            super.greet() // Կոչ է անում Base-ի greet()
            println("Hello from Derived")
        }
    
        override val value: Int = 2
            get() {
                println("Accessing Derived value")
                return super.value + 1 // Հասանելիություն Base-ի value-ին
            }
    }
    
  3. Հասանելիություն կոնկրետ սուպերտիպի անդամներին (միաժամանակյա բազմաբնույթ ինտերֆեյսների դեպքում): Եթե դասը իրականացնում է մի քանի ինտերֆեյս, որոնք ունեն նույնանուն անդամներ, ապա super-ը և ինտերֆեյսի անունը անկյունագծային փակագծերում (super<TypeName>) թույլ է տալիս հստակ նշել, թե որ անդամին է վերաբերում:

    interface MyInterface1 {
        fun foo() { println("MyInterface1 foo") }
    }
    
    interface MyInterface2 {
        fun foo() { println("MyInterface2 foo") }
    }
    
    class MyClass : MyInterface1, MyInterface2 {
        override fun foo() {
            super<MyInterface1>.foo() // Կոչ է անում MyInterface1-ի foo()
            super<MyInterface2>.foo() // Կոչ է անում MyInterface2-ի foo()
        }
    }