Inheritances
Dalam gambaran dunia nyata, banyak objek yang berbeda tetapi punya kesamaan atau kemiripan tertentu.
Contohnya Kucing dan Kambing memiliki banyak kesamaan karena objek tersebut merupakan hewan. Kucing merupakan hewan mamalia, begitu juga dengan kambing.
Mungkin yang membedakan objek tersebut adalah cara mereka mencari makanan dan jenis makanan yang dimakan. Sama halnya pada OOP, beberapa objek yang berbeda bisa saja memiliki kesamaan dalam hal tertentu.
Di situlah konsep inheritance atau pewarisan harus diterapkan. Pewarisan dapat mencegah kita melakukan perulangan kode. Untuk lebih memahaminya lihatlah contoh bagan pada sebuah kelas berikut:
Cat | Fish | Snake |
+ name: String + furColor: String + weight: Double + age: Integer + numberOfFeet: Integer + isCarnivore: Boolean | + name: String + scaleColor: String + weight: Double + age: Integer + numberOfFin: Integer + isCarnivore: Boolean | + name: String + skinColor: String + weight: Double + age: Integer + isToxic: Boolean + isCarnivore: Boolean |
- eat() - sleep() - playWithHuman() | - eat() - sleep() - swim() | - eat() - sleep() - bite() |
Pada bagan tersebut dapat kita lihat pada kelas Cat, Fish dan Snake memiliki beberapa properti yang sama seperti name, weight, age, isCarnivore dan juga memiliki beberapa fungsi yang sama seperti eat() dan sleep(). Jika kita ubah diagram kelas Kucing menjadi sebuah kode maka akan menjadi seperti ini:
- class Cat(val name: String, val furColor: String, val weight: Double, val age: Integer, val numberOfFeet: Integer, val isCarnivore: Boolean) {
- fun eat(){
- println("$name sedang makan!")
- }
- fun sleep() {
- println("$name sedang tidur!")
- }
- fun playWithHuman() {
- println("$name bermain dengan Manusia!")
- }
- }
Tidak ada masalah dengan kode tersebut, tetapi ketika kita akan membuat kelas dari diagram lainnya contohnya Fish maka kita harus menuliskan ulang properti seperti name, weight, age dan properti atau fungsi yang sama lainnya. Hal ini dapat mengurangi efisiensi dalam menuliskan kode.
Dengan teknik inheritance, kita bisa mengelompokkan properti dan fungsi yang sama. Caranya , buat sebuah kelas baru yang nantinya akan diturunkan sifatnya pada sebuah kelas:
Animal |
+ name: String + weight: Double + age: Integer + isCarnivore: Boolean |
- eat() - sleep() |
Cat | Fish | Snake |
+ furColor: String + numberOfFeet: Integer | + scaleColor: String + numberOfFin: Integer | + skinColor: String + isToxic: Boolean |
playWithHuman() | swim() | - bite() |
Ketika kelas Animal telah dibuat, kelas lainnya dapat melakukan extends pada kelas tersebut. Dalam pewarisan, kelas Animal (main class) dapat disebut sebagai super atau parent class. Kelas yang melakukan extends pada kelas tersebut disebut child class. Dalam Kotlin untuk melakukan extends pada sebuah kelas dapat dilakukan dengan tanda : seperti contoh berikut:
- class ChildClass : ParentClass {
- }
Mari kita buat kelas Animal yang akan berperan sebagai parent class seperti berikut:
- open class Animal(val name: String, val weight: Double, val age: Int, val isCarnivore: Boolean){
- open fun eat(){
- println("$name sedang makan!")
- }
- open fun sleep(){
- println("$name sedang tidur!")
- }
- }
Untuk membuat sebuah super atau parent class kita akan membutuhkan open class. Kelas pada Kotlin secara default bersifat final, oleh karena itu kita harus mengubahnya menjadi open class sebelum melakukan extends kelas tersebut.
Ubahlah kelas Cat dengan melakukan extends pada kelas Animal seperti berikut:
- class Cat(pName: String, pWeight: Double, pAge: Int, pIsCarnivore: Boolean, val furColor: String, val numberOfFeet: Int)
- : Animal(pName, pWeight, pAge, pIsCarnivore) {
- fun playWithHuman() {
- println("$name bermain bersama Manusia !")
- }
- override fun eat(){
- println("$name sedang memakan ikan !")
- }
- override fun sleep() {
- println("$name sedang tidur di bantal !")
- }
- }
Dengan begitu, selain fungsi yang terdapat di dalamnya, kelas Cat juga dapat mengakses seluruh fungsi dan properti yang terdapat kelas Animal.
- fun main(){
- val dicodingCat = Cat("Dicoding Miaw", 3.2, 2, true, "Brown", 4)
- dicodingCat.playWithHuman()
- dicodingCat.eat()
- dicodingCat.sleep()
- }
- /*
- output:
- Dicoding Miaw bermain bersama Manusia !
- Dicoding Miaw sedang memakan ikan !
- Dicoding Miaw sedang tidur di bantal !
- */