Middle
Фарқи байни синфҳои sealed ва синфҳои абстрактӣ дар Kotlin чист?
sobes.tech AI
Ҷавоб аз AI
Ҷудо кардани асосии байни синфҳои sealed ва синфҳои абстрактӣ дар он аст, ки синфҳои sealed маҳдуд мекунанд ҳиерархии меросро дар дохили як файл ё модул (барои Kotlin 1.5+). Наследкунандагони синфи sealed бояд дар ҳамон файл бо sealed класс эълон шаванд, ки ин кафолат медиҳад, ки дар истифодаи изразҳои when тафтишоти пурра анҷом мешавад.
Фарқиятҳо:
- Меросгирӣ:
- Синфҳои абстрактӣ метавонанд дар ҳар ҷое дар лоиҳа мерос гирифта шаванд.
- Синфҳои sealed метавонанд танҳо дар дохили ҳамин файл (то Kotlin 1.5) ё дар дохили ҳамин модул (бо Kotlin 1.5+) мерос гиранд.
- Истифода бо
when:- Вақте ки бо типи sealed истифода мешавад, компилятор метавонад санҷад, ки ҳама подтипҳо дар назар гирифта шудаанд, ки ин
when-ро пурра мекунад ва эҳтиёҷ ба таърифи мустақимelse-ро бартараф мекунад, агар ҳама подтипҳо коркард шаванд. - Бо синфҳои абстрактӣ, компилятор наметавонад кафолат диҳад, ки ҳама подтипҳо дар назар гирифта шудаанд, бинобар ин одатан
elseлозим аст.
- Вақте ки бо типи sealed истифода мешавад, компилятор метавонад санҷад, ки ҳама подтипҳо дар назар гирифта шудаанд, ки ин
- Эҷоди намунаҳо:
- На синфҳои абстрактӣ, на sealed намешаванд мустақиман.
- Аъзои:
- Ҳам синфҳои абстрактӣ ва ҳам sealed метавонанд аъзои абстрактӣ ва ғайриабстрактӣ дошта бошанд.
Маслиҳат барои синфи sealed:
sealed class Result<out T> {
data class Success<out T>(val data: T) : Result<T>()
data class Error(val message: String) : Result<Nothing>()
}
fun processResult(result: Result<Int>) {
when (result) {
is Result.Success -> {
// Коркарди натиҷаи муваффақ
println("Success: ${result.data}")
}
is Result.Error -> {
// Коркарди хато
println("Error: ${result.message}")
}
// Ниёз нест, агар ҳама наследникҳо коркард шаванд
}
}
Маслиҳат барои синфи абстрактӣ:
abstract class Shape {
abstract fun area(): Double
}
class Circle(val radius: Double) : Shape() {
override fun area(): Double = Math.PI * radius * radius
}
class Rectangle(val width: Double, val height: Double) : Shape() {
override fun area(): Double = width * height
}
fun calculateArea(shape: Shape): Double {
return shape.area()
}
Вақте ки бояд истифода шавад:
- Синфҳои sealed: Идеалӣ барои намоиши маҷмӯи маҳдуди ҳолатҳо ё намудҳо, вақте ки ба санҷиши пурра дар изразҳои
whenниёз доред. Бисёр вақт барои моделсозии натиҷаҳои амалҳо (муваффақ/хатогӣ), ҳолатҳои UI, ҳодисаҳо истифода мешаванд. - Синфҳои абстрактӣ: Барои муайян кардани функсионалӣ ва шартномаи умумӣ барои гурӯҳи синфҳои алоқаманд, ки метавонанд дар ҳар ҷое дар лоиҳа мерос гиранд.
Дар маҷмӯъ, синфҳои sealed назорати қатъӣ дар ҳиерархияи меросро таъмин мекунанд ва бехатарӣ ва хонданпазирии коди худро дар коркарди маҷмӯи маҳдуди подтипҳо беҳтар мекунанд.