Kotlin inheritance


Release date:2023-09-22 Update date:2023-10-13 Editor:admin View counts:265

Label:

Kotlin inheritance

Kotlin all classes in inherit the Any class, which is the superclass of all classes and the default superclass for classes that do nothave a supertype declaration

class Example // Implicit inheritance from Any

Three functions are provided by default of Any :

equals()

hashCode()

toString()

Note: Any is not java.lang.Object .

If a class is to be inherited, you can use the open keyword is modified.

open class Base(p: Int)           // Defining a Base Class

class Derived(p: Int) : Base(p)

Constructor function

Subclass has main constructor

If the subclass has a primary constructor, the base class must be initialized immediately in the main constructor.

open class Person(var name : String, var age : Int){// Base class

}

class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {

}

// test
fun main(args: Array<String>) {
    val s =  Student("Runoob", 18, "S12346", 89)
    println("Student name: ${s.name}")
    println("Age: ${s.age}")
    println("Student ID: ${s.no}")
    println("Achievement: ${s.score}")
}

Output result:

Student name: Runoob
Age: 18
Student ID: S12346
Achievement: 89

Subclass does not have a main constructor

If the subclass does not have a primary constructor, it must be used in eachsecondary constructor super keyword initializes the base class, or proxies another constructor. When you initialize a base class, you can call different constructors of the base class.

class Student : Person {

    constructor(ctx: Context) : super(ctx) {
    }

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
    }
}

Example

/**User base class**/
open class Person(name:String){
    /**Secondary constructor**/
    constructor(name:String,age:Int):this(name){
        //initialization
        println("-------Base class secondary constructor---------")
    }
}

/**Subclass inherits the Person class**/
class Student:Person{

    /**Secondary constructor**/
    constructor(name:String,age:Int,no:String,score:Int):super(name,age){
        println("-------Inheritance class secondary constructor---------")
        println("Student name: ${name}")
        println("Age: ${age}")
        println("Student ID: ${no}")
        println("Achievement: ${score}")
    }
}

fun main(args: Array<String>) {
    var s =  Student("Runoob", 18, "S12345", 89)
}

Output result:

-------Base class secondary constructor---------
-------Inheritance class secondary constructor---------
Student Name: Runoob
Age: 18
Student ID: S12345
Score: 89

Rewrite

In the base class, use the fun when a function is declared, this function defaults to final modified and cannot be overridden by subclasses. If subclasses are allowed to override the function, add it manually open modify it, using the subclass rewriting method override key words:

/**User base class**/
open class Person{
    open fun study(){       // Allow subclass override
        println("I have graduated")
    }
}

/**Subclass inherits the Person class**/
class Student : Person() {

    override fun study(){    // override method
        println("I am studying in college")
    }
}

fun main(args: Array<String>) {
    val s =  Student()
    s.study();

}

The output is as follows:

I am studying in college

If there are multiple identical methods (inherited or implemented from otherclasses, such as classes A, B), you must override the method, using the super paradigm to selectively invoke the implementation of the parent class.

open class A {
    open fun f () { print("A") }
    fun a() { print("a") }
}

interface B {
    fun f() { print("B") } //The default member variable of
the interface is open
    fun b() { print("b") }
}

class C() : A() , B{
    override fun f() {
        super<A>.f()//call A.f()
        super<B>.f()//call B.f()
    }
}

fun main(args: Array<String>) {
    val c =  C()
    c.f();

}

C inherits from a() or b() C can not only inherit functions from A or B, but also C can inherit A()B() functions we have incommon. At this point, there is only one implementation of the function in,and in order to disambiguate, the function must call the A() and B() and provide your own implementation.

The output is as follows:

AB

Attribute rewriting

Property override use override keyword, the property must have a compatible type, and each declared property can be initialized through the initialization program or getter method is overridden:

open class Foo {
    open val x: Int get { …… }
}

class Bar1 : Foo() {
    override val x: Int = ……
}

You can use one. var property to override a val property, but not the other way around. Because val property itself defines the getter method, rewritten as var property declares an additional onein the derived class setter method

You can use it in the main constructor override keyword as part of the property declaration:

interface Foo {
    val count: Int
}

class Bar1(override val count: Int) : Foo

class Bar2 : Foo {
    override var count: Int = 0
}

Powered by TorCMS (https://github.com/bukun/TorCMS).