Bird
Raised Fist0
Kotlinprogramming~10 mins

Sealed classes for restricted hierarchies in Kotlin - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Sealed classes for restricted hierarchies
Define sealed class
↓
Define subclasses inside or outside
↓
Use when expression to check subclass
↓
Handle all subclasses exhaustively
↓
No other subclasses allowed outside hierarchy
↓
End
Sealed classes restrict subclassing to a known set, enabling exhaustive checks in when expressions.
Execution Sample
Kotlin
sealed class Shape {
    data class Circle(val radius: Double) : Shape()
    data class Rectangle(val width: Double, val height: Double) : Shape()
}

fun area(shape: Shape): Double = when(shape) {
    is Shape.Circle -> 3.14 * shape.radius * shape.radius
    is Shape.Rectangle -> shape.width * shape.height
}
Calculates area for Circle or Rectangle using sealed class Shape and exhaustive when.
Execution Table
StepActionInputConditionBranch TakenOutput
1Call area with Circle(radius=2.0)Circle(radius=2.0)shape is Circle?YesArea = 3.14 * 2.0 * 2.0 = 12.56
2Return area for Circle12.56
3Call area with Rectangle(width=3.0, height=4.0)Rectangle(width=3.0, height=4.0)shape is Circle?No
4Check if shape is RectangleRectangle(width=3.0, height=4.0)shape is Rectangle?YesArea = 3.0 * 4.0 = 12.0
5Return area for Rectangle12.0
6Call area with unknown subclass (not allowed)UnknownShape()No matching subclassErrorCompilation error: sealed class restricts subclasses
💡 Execution stops because all subclasses are handled; no other subclasses allowed outside sealed class.
Variable Tracker
VariableStartAfter 1After 2After 3Final
shape-Circle(radius=2.0)Rectangle(width=3.0, height=4.0)UnknownShape()-
area-12.5612.0Error-
Key Moments - 3 Insights
Why does the when expression not need an else branch?
Because the sealed class restricts subclasses, the when expression covers all cases explicitly (see execution_table rows 1-5).
Can we create a subclass of the sealed class outside its file?
No, sealed classes only allow subclasses defined in the same file, preventing unknown subclasses (see execution_table row 6).
What happens if a new subclass is added but not handled in when?
The compiler forces you to handle it or add an else branch, ensuring exhaustive checks.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the area output when shape is Circle(radius=2.0)?
A3.14
B12.56
C4.0
DError
💡 Hint
Check execution_table row 1 and 2 for Circle input and output.
At which step does the when expression handle the Rectangle subclass?
AStep 1
BStep 3
CStep 4
DStep 6
💡 Hint
Look at execution_table rows 3 and 4 for Rectangle handling.
If a new subclass is added outside the sealed class file, what happens?
ACompiler error due to sealed class restrictions
BIt compiles and runs normally
CIt runs but when expression skips it
DIt requires an else branch
💡 Hint
See execution_table row 6 about unknown subclass and error.
Concept Snapshot
sealed class ClassName {
  // subclasses defined here or same file
}

Use when to check all subclasses without else.
Compiler ensures no other subclasses exist.
Enables safe, exhaustive type checks.
Full Transcript
Sealed classes in Kotlin let you define a restricted set of subclasses. You declare a sealed class and its subclasses in the same file. This restriction helps the compiler know all possible subclasses. When you use a when expression on a sealed class, you can check all subclasses explicitly without needing an else branch. The compiler ensures you handle every subclass, making your code safer and clearer. If you try to create a subclass outside the sealed class file, the compiler will give an error. This way, sealed classes help you create restricted hierarchies with exhaustive checks.

Practice

(1/5)
1. What is the main purpose of using sealed classes in Kotlin?
easy
A. To create classes that cannot be instantiated
B. To allow any class in any file to inherit from it
C. To restrict which classes can inherit from it, all in the same file
D. To automatically generate data classes

Solution

  1. Step 1: Understand sealed class inheritance rules

    Sealed classes restrict subclassing to the same file, limiting which classes can extend them.
  2. Step 2: Compare options with sealed class purpose

    Only To restrict which classes can inherit from it, all in the same file correctly describes this restriction; others describe unrelated features.
  3. Final Answer:

    To restrict which classes can inherit from it, all in the same file -> Option C
  4. Quick Check:

    Sealed classes restrict inheritance = A [OK]
Hint: Sealed classes limit subclasses to one file only [OK]
Common Mistakes:
  • Thinking sealed classes prevent instantiation
  • Confusing sealed classes with abstract classes
  • Believing sealed classes allow open inheritance
2. Which of the following is the correct syntax to declare a sealed class named Shape in Kotlin?
easy
A. abstract sealed class Shape
B. open sealed class Shape {}
C. sealed interface Shape {}
D. sealed class Shape {}

Solution

  1. Step 1: Recall sealed class declaration syntax

    Sealed classes are declared with the keyword sealed class followed by the name and body.
  2. Step 2: Check each option's correctness

    sealed class Shape {} matches the correct syntax. open sealed class Shape {} wrongly combines open and sealed. sealed interface Shape {} uses sealed interface which is invalid. abstract sealed class Shape {} wrongly combines abstract and sealed.
  3. Final Answer:

    sealed class Shape {} -> Option D
  4. Quick Check:

    Correct sealed class syntax = D [OK]
Hint: Use only 'sealed class ClassName {}' to declare sealed classes [OK]
Common Mistakes:
  • Adding 'open' or 'abstract' keywords with sealed
  • Using 'sealed interface' instead of 'sealed class'
  • Forgetting curly braces after class name
3. Consider the following Kotlin code using sealed classes:
sealed class Result {
    data class Success(val data: String) : Result()
    object Failure : Result()
}

fun handle(result: Result) = when(result) {
    is Result.Success -> "Data: ${result.data}"
    is Result.Failure -> "Failed"
}

println(handle(Result.Success("OK")))

What is the output when this code runs?
medium
A. "Data: OK"
B. "Failed"
C. Compilation error due to missing else branch
D. Runtime exception

Solution

  1. Step 1: Understand sealed class and when expression

    The sealed class Result has two subclasses: Success and Failure. The when expression covers both cases without else.
  2. Step 2: Trace the function call with Success("OK")

    The argument is Result.Success("OK"), so the first branch matches, returning "Data: OK".
  3. Final Answer:

    "Data: OK" -> Option A
  4. Quick Check:

    Sealed class when covers all cases = "Data: OK" [OK]
Hint: Sealed classes allow exhaustive when without else [OK]
Common Mistakes:
  • Thinking else branch is required for sealed classes
  • Confusing Success and Failure outputs
  • Expecting runtime errors from sealed classes
4. The following Kotlin code tries to compile but fails. What is the error?
sealed class Animal
class Dog : Animal()
class Cat : Animal()

Why does this code cause a compilation error?
medium
A. Sealed classes cannot have subclasses
B. Subclasses Dog and Cat must be declared in the same file as Animal
C. Dog and Cat must be declared as sealed classes too
D. Animal must be declared as an abstract class instead

Solution

  1. Step 1: Recall sealed class subclass rules

    Sealed classes restrict subclasses to be declared in the same file.
  2. Step 2: Identify the error cause

    Dog and Cat are subclasses but declared outside the sealed class file, causing compilation error.
  3. Final Answer:

    Subclasses Dog and Cat must be declared in the same file as Animal -> Option B
  4. Quick Check:

    Sealed subclasses must be in same file = B [OK]
Hint: All sealed subclasses must be in the same file [OK]
Common Mistakes:
  • Thinking sealed classes forbid any subclassing
  • Believing subclasses must be sealed too
  • Confusing sealed with abstract class rules
5. You want to model a fixed set of user roles in Kotlin using sealed classes: Admin, Guest, and Member. Which approach correctly uses sealed classes to restrict roles and safely handle all cases?
hard
A. sealed class UserRole { object Admin : UserRole() object Guest : UserRole() object Member : UserRole() } fun describe(role: UserRole) = when(role) { is UserRole.Admin -> "Admin user" is UserRole.Guest -> "Guest user" is UserRole.Member -> "Member user" }
B. open class UserRole class Admin : UserRole() class Guest : UserRole() class Member : UserRole() fun describe(role: UserRole) = when(role) { is Admin -> "Admin user" is Guest -> "Guest user" is Member -> "Member user" else -> "Unknown" }
C. sealed interface UserRole { object Admin : UserRole object Guest : UserRole object Member : UserRole } fun describe(role: UserRole) = when(role) { UserRole.Admin -> "Admin user" UserRole.Guest -> "Guest user" UserRole.Member -> "Member user" }
D. abstract class UserRole object Admin : UserRole() object Guest : UserRole() object Member : UserRole() fun describe(role: UserRole) = when(role) { is Admin -> "Admin user" is Guest -> "Guest user" is Member -> "Member user" }

Solution

  1. Step 1: Use sealed class to restrict subclasses

    sealed class UserRole { object Admin : UserRole() object Guest : UserRole() object Member : UserRole() } fun describe(role: UserRole) = when(role) { is UserRole.Admin -> "Admin user" is UserRole.Guest -> "Guest user" is UserRole.Member -> "Member user" } declares a sealed class with all subclasses as objects inside the same file, restricting roles properly.
  2. Step 2: Check safe handling with exhaustive when

    The when expression covers all subclasses without else, ensuring safe handling.
  3. Final Answer:

    sealed class UserRole { object Admin : UserRole() object Guest : UserRole() object Member : UserRole() } fun describe(role: UserRole) = when(role) { is UserRole.Admin -> "Admin user" is UserRole.Guest -> "Guest user" is UserRole.Member -> "Member user" } -> Option A
  4. Quick Check:

    Sealed class + exhaustive when = safe fixed roles [OK]
Hint: Use sealed class with all subclasses inside one file [OK]
Common Mistakes:
  • Using open or abstract classes without sealing
  • Missing exhaustive when branches
  • Using sealed interface incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard