Dokumen tersebut membahas tentang pemrograman berorientasi objek (OOP) dalam bahasa pemrograman Kotlin, meliputi konsep-konsep seperti class, properties, function, inheritance, abstract class, interface, dan generics."
6. Class, Properties, & Function
Blueprint untuk membuat Object
fun main() {
val garfield = Cat("Orange", 27, 46, 4)
garfield.playing()
garfield.sleep()
garfield.eat()
garfield.purring()
}
7. Getter & Setter
class Animal{
var name: String = "Dicoding Miaw"
get(){
println("Fungsi Getter
terpanggil")
return field
}
set(value){
println("Fungsi Setter terpanggil")
field = value
}
}
fun main(){
val dicodingCat = Animal()
println("Nama: ${dicodingCat.name}" )
dicodingCat.name = "Goose"
println("Nama: ${dicodingCat.name}")
}
/*
output:
Fungsi Getter terpanggil
Nama: Dicoding Miaw
Fungsi Setter terpanggil
Fungsi Getter terpanggil
Nama: Goose
*/
11. Inheritance
class Cat : Animal() {
fun walk () {
}
override fun eat(){
}
override fun sleep() {
}
class ChildClass : ParentClass()
open class Animal(){
open fun eat(){
}
open fun sleep(){
}
}
agar dapat diwariskan
Cat menjadi turunan Animal
12. Abstract Class
Menghindari pembuatan instance dari kelas tersebut
abstract class Animal(
var name: String,
var weight: Double,
var age: Int,
var isCarnivore: Boolean){
}
fun main(){
val animal = Animal("dicoding animal", 2.6, 1, true)
}
*Cannot create an instance of an abstract class
14. Overloading
Membuat penamaan fungsi yang sama namun
berbeda parameternya.
class Animal(private var name: String) {
fun eat() {
println("$name makan!")
}
fun eat(typeFood: String) {
println("$name memakan $typeFood!")
}
fun eat(typeFood: String, quantity: Double) {
println("$name memakan $typeFood sebanyak $quantity
grams!")
}
}
fun main() {
val dicodingCat = Animal("Dicoding Miaw")
dicodingCat.eat()
dicodingCat.eat("Ikan Tuna")
dicodingCat.eat("Ikan Tuna", 450.0)
}
15. Interface
Supaya kelas turunan harus memiliki semua sifat yang sama
interface IFly {
fun fly()
}
class Bird : IFly {
override fun fly() {
println("I flying without wings")
}
}
harus ada
16. Property Delegation
Mengirimkan tugas pada kelas lain
class DelegateName {
private var value: String = "Default"
operator fun getValue(classRef: Any?, property: KProperty<*>) : String {
println("")
return value
}
operator fun setValue(classRef: Any?, property: KProperty<*>, newValue: String){
println("")
value = newValue
}
}
class Animal {
var name: String by DelegateName()
}
class Person {
var name: String by DelegateName()
}
19. Apa itu Generic?
dapat digunakan secara umum untuk berbagai macam tipe data
Contoh yang sudah ada di Kotlin:
val contributor = listOf("alfian","nrohmen","dimans","widy")
val contributorAge = listOf(17, 27, 37, 48)
val contributorSupport = listOf(true, false, false, true)
*listOf bisa digunakan secara umum (tipe data apa aja)
20. Cara Membuat Kelas Generic
fun main() {
val longArrayList = ArrayList<Long>()
val firstLong = longArrayList[0]
}
class ArrayList<T> : List<T> {
override fun get(index: Int): T {
return this[index]
}
}
interface List<T> {
operator fun get(index: Int): T
}
Angle brackets <>
21. Cara Membuat Fungsi
Genericfun main() {
val numbers = (1..100).toList()
print(numbers.potong(1..10))
}
fun <T> List<T>.potong(indices: IntRange): List<T> {
if (indices.isEmpty()) return listOf()
return this.subList(indices.first, indices.last + 1).toList()
}
22. Constraint Type Parameter
Pembatasan tipe nilai yang akan disematkan ke dalam parameter.
fun main() {
val numbers = ListNumber<Long>()
val numbers2 = ListNumber<Int>()
val numbers3 = ListNumber<String>()
error : Type argument is not within its bounds
}
class ListNumber<T : Number> : List<T>{
override fun get(index: Int): T {
return this[index]
}
}
interface List<T> {
operator fun get(index: Int): T
}
fun main() {
val numbers = listOf(1, 2, 3, 4, 5)
numbers.sumNumber()
val names = listOf("dicoding", "academy")
names.sumNumber()
// error : inferred type String is not a subtype of Number
}
fun <T : Number> List<T>.sumNumber() : T {
/* .. */
}
23. Variance
Variance dibutuhkan ketika kita ingin membuat kelas atau fungsi generic dengan
batasan yang tidak akan mengganggu dalam penggunaannya.
24. Covariant
tipe argument hanya dapat digunakan sebagai
tipe nilai kembalian
interface List<out E> : Collection<E> {
operator fun get(index: Int): E
}
Contravariant
tipe argument dapat digunakan sebagai
argumen untuk sebuah fungsi
interface Comparable<in T> {
operator fun compareTo(other: T): Int
}
26. Aku lebih takut kepada orang yang melatih
1 buah jurus tendangan 1000 kali,
daripada kepada orang yang berlatih
1000 jurus tendangan 1 kali".
- Bruce Lee
’’
’’
27. You can find me at:
● Google : Ahmad Arif Faizin
● Discord : @arifaizin
Thanks!
Any questions?