Menu
CoddyTech

Mendeklarasikan Interface

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 22 dari 57.

Sebuah interface mencantumkan hal-hal yang dapat dilakukan oleh suatu tipe tanpa menjelaskan caranya. Interface mendeklarasikan method dan property yang harus disediakan oleh setiap class yang mengimplementasikannya. Sebuah class mengimplementasikan interface dengan titik dua, seperti pada superclass, tetapi tanpa tanda kurung karena interface tidak memiliki konstruktor:

interface Drawable {
    fun draw(): String
}
class Circle(val radius: Int) : Drawable {
    override fun draw() = "circle with radius $radius"
}
class Line(val length: Int) : Drawable {
    override fun draw() = "-".repeat(length)
}

Di dalam main:

println(Circle(3).draw())
println(Line(5).draw())

Output:

circle with radius 3
-----

Sebuah interface juga dapat mendeklarasikan property. class menyediakan property tersebut sebagai property konstruktor, property tersimpan, atau getter; interface itu sendiri tidak menyimpan apa pun:

interface Vehicle {
    val wheels: Int
    val label: String
}
class Car(override val label: String) : Vehicle {
    override val wheels = 4
}
class Bike : Vehicle {
    override val wheels = 2
    override val label: String
        get() = "bike on $wheels wheels"
}

Di dalam main:

println("${Car("taxi").label}: ${Car("taxi").wheels}")
println(Bike().label)

Output:

taxi: 4
bike on 2 wheels

Setiap anggota yang dideklarasikan oleh interface harus diimplementasikan, masing-masing dengan override, atau class tidak dapat dikompilasi. Interface tidak dapat dibuat instance-nya:

interface Speaker {
    fun speak(): String
    val volume: Int
}
// class Mute : Speaker { override fun speak() = "" }   // error: volume belum diimplementasikan
// class Loud : Speaker() { ... }                      // error: interface tidak memiliki konstruktor
// val s = Speaker()                                   // error: interface tidak dapat dibuat

interface dan abstract class sama-sama mendeklarasikan anggota tanpa body. interface tidak memiliki constructor dan state yang tersimpan, dan sebuah class dapat mengimplementasikan banyak interface, tetapi hanya dapat mewarisi satu class. Gunakan interface untuk kemampuan yang dimiliki bersama oleh class yang tidak berkaitan, seperti Drawable atau Comparable, dan abstract class sebagai basis umum yang memiliki state.

interface Drawable { fun draw(): String }                   // sebuah kemampuan
abstract class Shape(val name: String) { abstract fun area(): Double }   // class dasar dengan status
class Square(val s: Double) : Shape("square"), Drawable {  // satu class, banyak interface
    override fun area() = s * s
    override fun draw() = "[]"
}
challenge icon

Tantangan

Mudah

Deklarasikan anggota interface Shape: property hanya-baca name dan method area() serta perimeter(), yang keduanya mengembalikan Double. Buat Rectangle(width, height) (name rectangle) dan Circle(radius) (name circle, menggunakan Math.PI) untuk mengimplementasikannya. Lalu lengkapi describe(shape), yang mengembalikan rectangle: area 12.00, perimeter 14.00 dengan dua angka desimal, hanya menggunakan anggota Shape.

Kode yang disediakan membaca baris r,3,4 atau c,2, membuat shape yang sesuai, lalu mencetak describe(shape).

Tuliskan kodemu di Shape.kt, Rectangle.kt, Circle.kt, dan Functions.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    val input = generateSequence(::readLine).toList()
    for (line in input) {
        val p = line.split(",").map { it.trim() }
        val shape: Shape = if (p[0] == "r") Rectangle(p[1].toDouble(), p[2].toDouble()) else Circle(p[1].toDouble())
        println(describe(shape))
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Kotlin