Menu
Coddy logo textTech

Birden Çok Arayüz

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 24 / 57.

Bir sınıf, virgüllerle ayrılmış birkaç arayüzü uygulayabilir. Hepsinin üyelerini uygulaması gerekir:

interface Switchable {
    var isOn: Boolean
    fun toggle() { isOn = !isOn }
}
interface Dimmable {
    var level: Int
}
class Lamp : Switchable, Dimmable {
    override var isOn = false
    override var level = 100
}

main içinde:

val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")

Çıktı:

true 40

Bir sınıf, aynı başlıkta bir sınıfı genişletebilir ve arayüzleri uygulayabilir. Yalnızca üst sınıfın kurucu çağrısı vardır:

open class Device(val name: String)
interface Rechargeable {
    fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
    override fun charge() = "$name is charging"
}

main içinde:

println(Phone("Pixel").charge())

Çıktı:

Pixel is charging

İki arayüz aynı yönteme varsayılan bir gövde sağladığında, sınıf bu yöntemi geçersiz kılmalı ve ne yapacağına karar vermelidir. super<Name>.method(), belirli bir arayüzün sürümünü çağırır:

interface Camera {
    fun describe() = "takes photos"
}
interface Telephone {
    fun describe() = "makes calls"
}
class SmartPhone : Camera, Telephone {
    override fun describe() = super<Telephone>.describe() + " and " + super<Camera>.describe()
}

main içinde:

println(SmartPhone().describe())

Çıktı:

makes calls and takes photos

Bir arayüz diğer arayüzleri genişletebilir. Birleşik arayüzü uygulayan bir sınıf, bunların tüm üyelerini sağlamalıdır ve bunların her biri olarak kabul edilir:

interface Named {
    val name: String
}
interface Contact : Named {
    val email: String
    fun card() = "$name <$email>"
}
class Person(override val name: String, override val email: String) : Contact

main içinde:

val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)

Çıktı:

Ada <ada@example.com>
Ada
challenge icon

Görev

Kolay

İki arayüz akıllı bir cihazı tanımlar: Switchable, çağıranlar için salt okunur bir Boolean olan isOn değerini ve toggle() işlevini gerektirir; Dimmable ise yazılabilir bir brightness gerektirir. SmartLamp sınıfının her ikisini de uygulamasını sağlayın: başlangıçta parlaklığı 100 ve kapalı olsun, toggle() onu açıp kapatsın, 0 ile 100 dışındaki bir parlaklık setter tarafından bu aralığa sınırlandırılsın ve status() on 70% veya off döndürsün.

Sağlanan kod, toggle komutlarını veya bir parlaklık sayısını okur, bunları tek bir lambaya uygular ve her birinden sonra status() yazdırır; ardından lambanın Switchable ve Dimmable olduğunu kontrol eder.

Kodunuz Switchable.kt, Dimmable.kt ve SmartLamp.kt dosyalarına yazılmalıdır. Main.kt sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    val input = generateSequence(::readLine).toList()
    val lamp = SmartLamp()
    for (cmd in input) {
        if (cmd == "toggle") lamp.toggle() else lamp.brightness = cmd.toInt()
        println(lamp.status())
    }
    println("switchable: ${(lamp as Any) is Switchable}, dimmable: ${(lamp as Any) is Dimmable}")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground