-
Notifications
You must be signed in to change notification settings - Fork 23
About sealed class in android
Devrath edited this page Dec 22, 2023
·
15 revisions
There are only abstract methods defined and concrete implementations are defined.
sealed class Animal {
object Cat : Animal() // We can define a Object classes like this
data class Dog(val name: String) : Animal() // We can define data classes like this
}
- Here you can observe that we are inheriting
Animal
forCamel
andMonkey
but it's defined in the same file. If we try to inherit in another file, it will not work. - What the
sealed
modifier
does is, that it is impossible to define another subclass outside the file. - Because of this, we know the sub-classes of a class by just analyzing a single file.
- In Kotlin, a sealed class is typically defined in a single file. However, you can extend a sealed class with subclasses in different files. Each subclass should be in its own file, and they can be spread across multiple files within the same package.
Animal.kt
package com.demo.subclasses
sealed class Animal {
object Cat : Animal() // We can define a Object classes like this
data class Dog(val name: String) : Animal() // We can define data classes like this
}
object Camel : Animal()
object Monkey : Animal()
- In
kotlin
classes arefinal
by default meaning they cannot be inherited by just extending. - We need to explicitly make them
open
to be inherited. - Sealed classes fit between
final
andopen
. This Final <------->Sealed classes
<-------> Open - So sealed classes help in taking advantage of inheritance but in a limited format.
- This will ensure we don't end up with a massive long inheritance tree and not knowing easily where it's inherited by whom but here all the children are in the same class.
- Earlier we noticed that, If a
sealed class
is inheriting anothersealed class
, it has to be defined in the same file to restrict the hierarchy. - But say a
normal class
, It can extend the sealed class even outside the file ofsealed class
Monkey.kt
class Monkey : Animal() {
init {
println("Initializing the monkey class")
}
}
- If we mark the
member-function
andmember-variable
private, no one outside the sealed class can access it. - No instance of sealed class also can access it if marked private.
- We can do it by making
companion object
and defining the constants inside. - We cannot define the constants outside the
companion object
.
sealed class Animal {
companion object {
const val color : String = "Red"
const val age : Int = 50
}
//const val height : Int = 50 // -----------> This is not possible
}
- We cannot create a object of sealed class
- But we can extend normal class with sealed class and create a object of normal class.