Bird
Raised Fist0
Kotlinprogramming~5 mins

Sealed classes for restricted hierarchies in Kotlin - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a sealed class in Kotlin?
A sealed class is a special kind of class that restricts which other classes can inherit from it. It helps to define a closed set of subclasses, making the hierarchy controlled and known at compile time.
Click to reveal answer
intermediate
Why use sealed classes instead of open classes?
Sealed classes limit subclassing to a fixed set of types, which helps the compiler check when all cases are handled, especially in when expressions. Open classes allow unlimited subclassing, which can lead to less safe code.
Click to reveal answer
intermediate
How do sealed classes improve when expressions?
When you use a sealed class in a <code>when</code> expression, the compiler knows all possible subclasses. This means you don't need an <code>else</code> branch if you cover all subclasses, making your code safer and clearer.
Click to reveal answer
beginner
Can sealed classes have subclasses in other packages?
No. All direct subclasses of a sealed class must be declared in the same package or the same file as the sealed class. This restriction keeps the hierarchy closed and controlled.
Click to reveal answer
beginner
Example: Define a sealed class Shape with subclasses Circle and Rectangle.
sealed class Shape {
    data class Circle(val radius: Double) : Shape()
    data class Rectangle(val width: Double, val height: Double) : Shape()
}
Click to reveal answer
What is a key feature of sealed classes in Kotlin?
AThey restrict subclassing to the same package.
BThey allow subclassing from any file.
CThey cannot have subclasses.
DThey are the same as abstract classes.
Why does Kotlin allow omitting the else branch in a when expression with sealed classes?
ABecause sealed classes have no subclasses.
BBecause <code>else</code> is never needed in Kotlin.
CBecause sealed classes are final.
DBecause the compiler knows all subclasses at compile time.
Which of these is NOT true about sealed classes?
AThey can have abstract members.
BThey can be instantiated directly.
CTheir subclasses must be in the same file.
DThey help with exhaustive <code>when</code> checks.
What keyword is used to declare a sealed class in Kotlin?
Asealed
Bopen
Cabstract
Dfinal
Which of the following is a benefit of using sealed classes?
AUnlimited subclassing across packages.
BBetter control over class hierarchies and safer code.
CThey automatically generate getters and setters.
DThey allow multiple inheritance.
Explain what a sealed class is and why it is useful in Kotlin.
Think about how sealed classes help the compiler know all possible subclasses.
You got /4 concepts.
    Describe how sealed classes improve safety and readability when using when expressions.
    Focus on the relationship between sealed classes and exhaustive checks.
    You got /4 concepts.

      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