다중 인터페이스
Coddy Kotlin 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 24번째.
클래스는 쉼표로 구분하여 여러 인터페이스를 구현할 수 있습니다. 클래스는 모든 인터페이스의 멤버를 구현해야 합니다:
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 내부에서:
val lamp = Lamp()
lamp.toggle()
lamp.level = 40
println("${lamp.isOn} ${lamp.level}")출력:
true 40클래스는 동일한 헤더에서 하나의 클래스를 상속하고 인터페이스를 구현할 수 있습니다. 생성자 호출이 있는 것은 슈퍼클래스뿐입니다:
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 내부:
println(Phone("Pixel").charge())출력:
Pixel is charging두 인터페이스가 모두 동일한 메서드에 기본 본문을 제공하면, 클래스는 이를 재정의하고 어떻게 처리할지 결정해야 합니다. super<Name>.method()는 특정 인터페이스 중 하나의 버전을 호출합니다:
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 내부에서:
println(SmartPhone().describe())출력:
makes calls and takes photos인터페이스는 다른 인터페이스를 확장할 수 있습니다. 결합된 인터페이스를 구현하는 클래스는 모든 인터페이스의 멤버를 제공해야 하며, 각 인터페이스로 간주됩니다.
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) : Contactmain 내부에서:
val ada = Person("Ada", "ada@example.com")
val named: Named = ada
println(ada.card())
println(named.name)출력:
Ada <ada@example.com>
Ada챌린지
쉬움두 인터페이스가 스마트 기기를 설명합니다. Switchable은 isOn(호출자가 읽기만 할 수 있는 Boolean)과 toggle()을 요구하고, Dimmable은 쓰기 가능한 brightness를 요구합니다. SmartLamp가 두 인터페이스를 모두 구현하도록 만드세요. 처음에는 꺼진 상태이고 밝기는 100이며, toggle()은 켜짐과 꺼짐을 전환하고, 0에서 100 범위를 벗어난 밝기는 setter가 해당 범위로 제한하며, status()는 on 70% 또는 off를 반환해야 합니다.
제공된 코드는 toggle 명령 또는 밝기 숫자를 읽어 하나의 램프에 적용하고 각 명령 후 status()를 출력한 다음, 램프가 Switchable 및 Dimmable인지 확인합니다.
코드는 Switchable.kt, Dimmable.kt, SmartLamp.kt에 작성하세요. Main.kt에는 제공된 입출력 코드가 들어 있으며 편집할 수 없습니다.
직접 해보기
fun main() {
// 제공된 입력/출력 코드: 있는 그대로 유지하세요
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}")
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: Kotlin 플레이그라운드