Interfacce multiple
Fa parte della sezione Programmazione orientata agli oggetti del percorso Kotlin di Coddy. Lezione 24 di 57.
Una classe può implementare diverse interfacce, separate da virgole. Deve implementare i membri di tutte:
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
}All'interno di main:
val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")Output:
true 40Una classe può estendere una classe e implementare interfacce nella stessa intestazione. Solo la superclasse ha una chiamata al costruttore:
open class Device(val name: String)
interface Rechargeable {
fun charge(): String
}
class Phone(name: String) : Device(name), Rechargeable {
override fun charge() = "$name is charging"
}All'interno di main:
println(Phone("Pixel").charge())Output:
Pixel is chargingQuando due interfacce forniscono entrambe un corpo predefinito per lo stesso metodo, la classe deve sovrascriverlo e decidere cosa fare. super<Name>.method() chiama la versione di una specifica interfaccia:
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()
}Dentro main:
println(SmartPhone().describe())Output:
makes calls and takes photosUn'interfaccia può estendere altre interfacce. Una classe che implementa l'interfaccia combinata deve fornire i membri di tutte e conta come ciascuna di esse:
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) : ContactDentro main:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)Output:
Ada <ada@example.com>
AdaSfida
FacileDue interfacce descrivono un dispositivo intelligente: Switchable richiede isOn (un Boolean di sola lettura per chi lo usa) e toggle(), mentre Dimmable richiede un brightness scrivibile. Fai implementare entrambe a SmartLamp: parte spenta con luminosità 100, toggle() la accende e la spegne, un valore di luminosità inferiore a 0 o superiore a 100 viene limitato dal setter e status() restituisce on 70% oppure off.
Il codice fornito legge i comandi toggle o un numero che indica la luminosità, li applica a una lampada e stampa status() dopo ciascun comando, quindi verifica che la lampada sia Switchable e Dimmable.
Il tuo codice va inserito in Switchable.kt, Dimmable.kt e SmartLamp.kt. Main.kt contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
fun main() {
// Codice di input/output fornito: lascialo così com'è
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}")
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiCostruttori primariBlocchi init e convalidaCostruttori secondariRiepilogo - Tessera della biblioteca4Ereditarietà
Classi aperte e sottoclassiRidefinizione dei membrisuper e costruttoriClassi astratteRiepilogo - Elenco del personale2Proprietà e incapsulamento
Accessor personalizzatiModificatori di visibilitàSetter privatilazy e lateinitRipasso - Conto bancario5Interfacce
Dichiarare le interfacceMetodi predefinitiInterfacce multipleLe interfacce come tipiRiepilogo - Metodi di pagamento8Tipi generici
Funzioni genericheClassi genericheVincoli sui tipiVarianza con in e outRiepilogo - Coda con priorità11Progetto: Gestione della biblioteca
Libri e sociPrendere in prestito i libriEsercitati da solo: Playground Kotlin