Wiele interfejsów
Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 24 z 57.
Klasa może implementować kilka interfejsów, oddzielonych przecinkami. Musi implementować składowe wszystkich z nich:
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
}Wewnątrz main:
val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")Wynik:
true 40Klasa może dziedziczyć po jednej klasie i implementować interfejsy w tym samym nagłówku. Wywołanie konstruktora dotyczy tylko nadklasy:
open class Device(val name: String)
interface Rechargeable {
fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
override fun charge() = "$name is charging"
}Wewnątrz main:
println(Phone("Pixel").charge())Wynik:
Pixel is chargingGdy dwa interfejsy udostępniają tę samą metodę z domyślnym ciałem, klasa musi ją nadpisać i zdecydować, co zrobić. super<Name>.method() wywołuje wersję konkretnego interfejsu:
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()
}Wewnątrz main:
println(SmartPhone().describe())Wynik:
makes calls and takes photosInterfejs może rozszerzać inne interfejsy. Klasa implementująca połączony interfejs musi dostarczyć składowe wszystkich tych interfejsów i jest uznawana za każdy z nich:
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) : ContactWewnątrz main:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)Wynik:
Ada <ada@example.com>
AdaWyzwanie
ŁatwyDwa interfejsy opisują inteligentne urządzenie: Switchable wymaga isOn (tylko do odczytu Boolean dla wywołujących) oraz toggle(), a Dimmable wymaga zapisywalnego brightness. Zaimplementuj oba interfejsy w SmartLamp: lampa początkowo jest wyłączona, a jej jasność wynosi 100, toggle() przełącza ją między stanem włączonym i wyłączonym, jasność spoza zakresu od 0 do 100 jest ograniczana przez setter, a status() zwraca on 70% lub off.
Dostarczony kod odczytuje polecenia toggle lub liczbę określającą jasność, stosuje je do jednej lampy i po każdym z nich wyświetla status(), a następnie sprawdza, czy lampa implementuje Switchable i Dimmable.
Umieść swój kod w plikach Switchable.kt, Dimmable.kt i SmartLamp.kt. Plik Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
fun main() {
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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}")
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasKonstruktory główneBloki init i walidacjaKonstruktory dodatkowePodsumowanie — karta biblioteczna4Dziedziczenie
Klasy otwarte i podklasyNadpisywanie składowychsuper i konstruktoryKlasy abstrakcyjnePodsumowanie – katalog pracowników7Klasy specjalne
Klasy danychKlasy wyliczenioweHierarchie zapieczętowaneequals, hashCode, toStringPodsumowanie — śledzenie zamówień10Wzorce projektowe, część 2
Delegowanie za pomocą byWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Właściwości i hermetyzacja
Własne akcesoryModyfikatory widocznościPrywatne setterylazy i lateinitPowtórka – konto bankowe5Interfejsy
Deklarowanie interfejsówMetody domyślneWiele interfejsówInterfejsy jako typyPowtórzenie – metody płatności8Typy generyczne
Funkcje generyczneKlasy generyczneOgraniczenia typówKowariancja i kontrawariancja: in i outPodsumowanie — kolejka priorytetowa11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Kotlin