Kotlin Inheritance (Dengan Contoh)

Pada artikel ini, Anda akan mempelajari tentang warisan. Lebih khusus lagi, apa itu warisan dan bagaimana mengimplementasikannya di Kotlin (dengan bantuan contoh).

Pewarisan adalah salah satu fitur utama dari pemrograman berorientasi objek. Ini memungkinkan pengguna untuk membuat kelas baru (kelas turunan) dari kelas yang ada (kelas dasar).

Kelas turunan mewarisi semua fitur dari kelas dasar dan dapat memiliki fitur tambahannya sendiri.

Sebelum membahas detail tentang warisan Kotlin, kami sarankan Anda untuk memeriksa dua artikel ini:

  • Kelas dan Objek Kotlin
  • Pembuat Utama Kotlin

Mengapa warisan?

Misalkan, dalam aplikasi Anda, Anda menginginkan tiga karakter - guru matematika , pesepakbola, dan pengusaha .

Karena, semua karakter adalah orang, mereka bisa berjalan dan berbicara. Namun, mereka juga memiliki beberapa keahlian khusus. Seorang guru matematika dapat mengajar matematika , pemain sepak bola dapat bermain sepak bola dan seorang pengusaha dapat menjalankan bisnis .

Anda dapat membuat tiga kelas secara individual yang dapat berjalan, berbicara, dan melakukan keterampilan khusus mereka.

Di setiap kelas, Anda akan menyalin kode yang sama untuk berjalan dan berbicara untuk setiap karakter.

Jika Anda ingin menambahkan fitur baru - makan, Anda perlu menerapkan kode yang sama untuk setiap karakter. Ini dapat dengan mudah menjadi rawan kesalahan (saat menyalin) dan kode duplikat.

Akan jauh lebih mudah jika kita memiliki Personkelas dengan fitur dasar seperti berbicara, berjalan, makan, tidur, dan menambahkan keahlian khusus ke fitur tersebut sesuai karakter kita. Ini dilakukan dengan menggunakan warisan.

Menggunakan warisan, sekarang Anda tidak menerapkan kode yang sama untuk walk(), talk()dan eat()untuk setiap kelas. Anda hanya perlu mewarisinya .

Jadi, untuk MathTeacher(kelas turunan), Anda mewarisi semua fitur dari Person(kelas dasar) dan menambahkan fitur baru teachMath(). Demikian pula, untuk Footballerkelas, Anda mewarisi semua fitur Personkelas dan menambahkan fitur baru playFootball()dan seterusnya.

Ini membuat kode Anda lebih bersih, dapat dipahami, dan dapat diperpanjang.

Penting untuk diingat: Saat bekerja dengan inheritance, setiap kelas turunan harus memenuhi kondisi apakah itu "adalah" kelas dasar atau bukan. Dalam contoh di atas, MathTeacher adalah a Person , Footballer adalah a Person . Anda tidak dapat memiliki sesuatu seperti, Businessman adalah a Business .

Warisan Kotlin

Mari kita coba menerapkan pembahasan di atas dalam kode:

 open class Person (age: Int) (// kode untuk makan, berbicara, berjalan) class MathTeacher (age: Int): Person (age) (// fitur lain dari guru matematika) class Footballer (age: Int): Person ( age) (// fitur lain dari pesepakbola) class Businessman (age: Int): Person (age) (// fitur lain dari pengusaha)

Berikut, Personadalah kelas dasar, dan kelas MathTeacher, Footballerdan Businessmanberasal dari kelas Person.

Perhatikan, kata kunci opensebelum kelas dasar Person,. Ini penting.

Secara default, kelas di Kotlin bersifat final. Jika Anda terbiasa dengan Java, Anda tahu bahwa kelas final tidak dapat dijadikan subkelas. Dengan menggunakan anotasi terbuka pada sebuah kelas, compiler memungkinkan Anda untuk mendapatkan kelas baru darinya.

Contoh: Warisan Kotlin

 open class Person(age: Int, name: String) ( init ( println("My name is $name.") println("My age is $age") ) ) class MathTeacher(age: Int, name: String): Person(age, name) ( fun teachMaths() ( println("I teach in primary school.") ) ) class Footballer(age: Int, name: String): Person(age, name) ( fun playFootball() ( println("I play for LA Galaxy.") ) ) fun main(args: Array) ( val t1 = MathTeacher(25, "Jack") t1.teachMaths() println() val f1 = Footballer(29, "Christiano") f1.playFootball() )

Saat Anda menjalankan program, hasilnya adalah:

Nama saya Jack. Umur saya 25 tahun, saya mengajar di sekolah dasar. Nama saya Cristiano. Umur saya 29 tahun, saya bermain untuk LA Galaxy.

Di sini, dua kelas MathTeacherdan Footballerditurunkan dari Personkelas.

Konstruktor utama Personkelas menyatakan dua properti: usia dan nama, dan memiliki blok penginisialisasi. Blok initilizer (dan fungsi anggota) dari kelas dasar Persondapat diakses oleh objek dari kelas turunan ( MathTeacherdan Footballer).

Kelas yang diturunkan MathTeacherdan Footballermemiliki fungsi anggota sendiri-sendiri teachMaths()dan playFootball()masing - masing. Fungsi-fungsi ini hanya dapat diakses dari objek kelasnya masing-masing.

Ketika objek t1 MathTeacherkelas dibuat,

 val t1 = MathTeacher (25, "Jack")

Parameter diteruskan ke konstruktor utama. Di Kotlin, initblok dipanggil saat objek dibuat. Karena, MathTeacherditurunkan dari Personkelas, ia mencari blok penginisialisasi di kelas dasar (Orang) dan mengeksekusinya. Jika MathTeacherblok had init, kompilator juga akan mengeksekusi blok init dari kelas turunan.

Selanjutnya, teachMaths()fungsi objek t1disebut dengan menggunakan t1.teachMaths()pernyataan.

Program ini bekerja sama ketika objek f1dari Footballerkelas dibuat. Ini mengeksekusi blok init dari kelas dasar. Kemudian playFootball()metode Footballerkelas tersebut dinamakan using statement f1.playFootball().

Catatan Penting: Warisan Kotlin

  • Jika kelas memiliki konstruktor utama, basis harus diinisialisasi menggunakan parameter konstruktor utama. Dalam program di atas, kedua kelas turunan memiliki dua parameter agedan name, dan kedua parameter ini diinisialisasi dalam konstruktor utama di kelas dasar.
    Berikut contoh lainnya:
     open class Person(age: Int, name: String) ( // some code ) class Footballer(age: Int, name: String, club: String): Person(age, name) ( init ( println("Football player $name of age $age and plays for $club.") ) fun playFootball() ( println("I am playing football.") ) ) fun main(args: Array) ( val f1 = Footballer(29, "Cristiano", "LA Galaxy") )  
    Di sini konstruktor utama dari kelas turunan memiliki 3 parameter, dan kelas dasar memiliki 2 parameter. Perhatikan bahwa, kedua parameter kelas dasar diinisialisasi.
  • Jika tidak ada konstruktor utama, setiap kelas dasar harus menginisialisasi basis (menggunakan kata kunci super), atau mendelegasikan ke konstruktor lain yang melakukan itu. Sebagai contoh,
     fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> + $_data", 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )
    Untuk mempelajari lebih lanjut tentang cara kerja program ini, kunjungi Kotlin Secondary Constructor.

Fungsi dan Properti Anggota Utama

If the base class and the derived class contains a member function (or property) with the same name, you can need to override the member function of the derived class using override keyword, and use open keyword for the member function of the base class.

Example: Overriding Member Function

 // Empty primary constructor open class Person() ( open fun displayAge(age: Int) ( println("My age is $age.") ) ) class Girl: Person() ( override fun displayAge(age: Int) ( println("My fake age is $(age - 5).") ) ) fun main(args: Array) ( val girl = Girl() girl.displayAge(31) )

When you run the program, the output will be:

 My fake age is 26.

Here, girl.displayAge(31) calls the displayAge() method of the derived class Girl.

You can override property of the base class in similar way.

Visit how Kotlin getters and setters work in Kotlin before you check the example below.

 // Empty primary constructor open class Person() ( open var age: Int = 0 get() = field set(value) ( field = value ) ) class Girl: Person() ( override var age: Int = 0 get() = field set(value) ( field = value - 5 ) ) fun main(args: Array) ( val girl = Girl() girl.age = 31 println("My fake age is $(girl.age).") )

When you run the program, the output will be:

 My fake age is 26.

As you can see, we have used override and open keywords for age property in derived class and base class respectively.

Calling Members of Base Class from Derived Class

Anda dapat memanggil fungsi (dan mengakses properti) dari kelas dasar dari kelas turunan menggunakan superkata kunci. Begini caranya:

 open class Person() ( open fun displayAge(age: Int) ( println("My actual age is $age.") ) ) class Girl: Person() ( override fun displayAge(age: Int) ( // calling function of base class super.displayAge(age) println("My fake age is $(age - 5).") ) ) fun main(args: Array) ( val girl = Girl() girl.displayAge(31) )

Saat Anda menjalankan program, hasilnya adalah:

 Usia saya 31 tahun. Usia palsu saya 26 tahun.

Artikel yang menarik...