Reuse your solution from the previous task, but replace the interface with the sealed interface. Then you no longer need the else branch in when.
fun eval(expr: Expr): Int =
when (expr) {
is Num -> TODO()
is Sum -> TODO()
}
interface Expr
class Num(val value: Int) : TODO()
class Sum(val left: Expr, val right: Expr) : TODO()
fun eval(expr: Expr): Int =
when (expr) {
is Num -> expr.value
is Sum -> eval(expr.left) + eval(expr.right)
}
sealed interface Expr
class Num(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr
인터페이스를 sealed interface
로 교체하는 문제이다.
Sealed 클래스
답은 간단하게 작성되었다. interface앞에 sealed 예약어만 붙이면 된다.
그런데 sealed 예약어를 붙이는 것과 안붙이는 것의 차이는 뭘까 궁금해졌다.
일반 클래스는 그 클래스 자체가 객체 생성이 가능하지만,
sealed 클래스는 기본으로 abstract를 내장하고 있으므로 객체 생성이 불가능하다고 한다.
그러면 추상 클래스로 만들면 되는거 아닌가싶었다.
하지만 sealed 클래스는 생성자가 private로 강제되어 있다.
(추상 클래스는 접근제어자 고정되어있지 않음)
그렇기 때문에 같은 파일 내에서만 sealed 클래스를 상속할 수 있다.