sealed class و interface در Kotlin — چیست، نحو و کاربرد

نویسنده: IT Sectr منتشر شده: 2026-06-20 زمان مطالعه: 11 دقیقه

sealed class و sealed interface در Kotlin مکانیسم‌های سلسله‌مراتب محدود نوع هستند که در آن همه زیرکلاس‌های ممکن در زمان کامپایل شناخته شده‌اند. برخلاف کلاس‌های انتزاعی معمولی، sealed class پردازش جامع همه گزینه‌ها در عبارت when را تضمین می‌کند. طبق مستندات JetBrains Kotlin Language Guide (2026)، انواع sealed اساس مدل‌سازی حالات، صفحه‌های UI و انواع نتیجه در پروژه‌های Kotlin هستند.

نکات اصلی

  • sealed — سلسله‌مراتب محدود که در آن همه زیرکلاس‌ها در زمان کامپایل شناخته شده‌اند
  • when — پردازش جامع همه زیرکلاس‌ها بدون بلوک else اجباری
  • sealed interface — اضافه شده در Kotlin 1.5 برای سلسله‌مراتب انعطاف‌پذیر بدون محدودیت ارث‌بری
  • کامپایل — خطای کامپایل در when ناقص برای انواع sealed
  • سلسله‌مراتب — همه زیرکلاس‌ها باید در یک فایل یا داخل sealed class باشند

sealed class و sealed interface چیست؟

sealed class یک کلاس انتزاعی با محدودیت است: همه زیرکلاس‌های مستقیم آن باید در همان فایلی که sealed class اعلام شده است، اعلام شوند. این محدودیت سلسله‌مراتب را بسته (sealed) می‌کند — هیچ کدی خارج از فایل نمی‌تواند زیرکلاس جدیدی اضافه کند.

sealed interface که در Kotlin 1.5 اضافه شده، همان تضمین را با انعطاف‌پذیری اینترفیس ارائه می‌دهد: sealed interface می‌تواند توسط چندین کلاس، شیء یا اینترفیس دیگر در یک فایل پیاده‌سازی شود. برخلاف sealed class، sealed interface محدودیت ارث‌بری تکی ندارد — یک کلاس می‌تواند چندین sealed interface را همزمان پیاده‌سازی کند.

بر اساس Kotlin Evolution and Roadmap (2026)، sealed interface به درخواست جامعه برای مدل‌سازی انعطاف‌پذیرتر اضافه شده است. انگیزه اصلی امکان ترکیب سلسله‌مراتب نوع مستقل بدون ارث‌بری چندگانه کلاس‌ها بود.

نحو sealed class

اعلام sealed class با کلمه کلیدی sealed قبل از class شروع می‌شود. زیرکلاس‌ها در همان فایل اعلام می‌شوند.

kotlin
sealed class NetworkResult {
    data class Success(val data: String) : NetworkResult()
    data class Error(val message: String) : NetworkResult()
    object Loading : NetworkResult()
}

هر زیرکلاس sealed class می‌تواند ویژگی‌ها و متدهای خاص خود را داشته باشد. Loading یک singleton (object)، Success و Error data class با پارامتر هستند. کامپایلر هر سه گزینه را می‌داند و کامل بودن آنها را در هنگام استفاده از when بررسی می‌کند.

sealed class تو در تو

sealed کلاس‌ها می‌توانند تو در تو باشند و سلسله‌مراتب چندسطحی برای مدل‌های داده پیچیده بدون از دست دادن امنیت نوع ایجاد کنند.

kotlin
sealed class UiState {
    object Idle : UiState()
    object Loading : UiState()
    data class Content(val items: List<Item>) : UiState()
    data class Error(val exception: Throwable) : UiState()
}

نحو sealed interface (Kotlin 1.5+)

sealed interface مشابه sealed class اعلام می‌شود، اما امکان پیاده‌سازی چندین sealed interface را در یک کلاس فراهم می‌کند.

kotlin
sealed interface Action
sealed interface Loggable

data class Navigate(val route: String) : Action, Loggable
data class ShowToast(val text: String) : Action
object GoBack : Action, Loggable

کلاس Navigate دو sealed interface — Action و Loggable را همزمان پیاده‌سازی می‌کند. برای sealed class این به دلیل محدودیت ارث‌بری تکی غیرممکن است. sealed interface انعطاف‌پذیری ترکیب سلسله‌مراتب مستقل را فراهم می‌کند.

چه زمانی sealed interface را به sealed class ترجیح دهیم

sealed interface وقتی ارجح است که سلسله‌مراتب به حالت یا سازنده مشترک نیاز نداشته باشد. طبق JetBrains Kotlin Guidelines (2026)، sealed interface باید به طور پیش‌فرض برای همه سلسله‌مراتب جدیدی که نیاز به سازنده مشترک ندارند استفاده شود، که کد را برای توسعه‌های آینده انعطاف‌پذیرتر می‌کند.

پردازش جامع در when

مزیت اصلی انواع sealed پردازش جامع (exhaustive) در عبارت when است. کامپایلر بررسی می‌کند که همه زیرکلاس‌های ممکن در نظر گرفته شده‌اند.

kotlin
fun handleResult(result: NetworkResult): String = when (result) {
    is NetworkResult.Success -> "Data: ${result.data}"
    is NetworkResult.Error -> "Error: ${result.message}"
    is NetworkResult.Loading -> "Loading..."
    // else الزامی نیست — کامپایلر می‌داند که همه انواع پوشش داده شده‌اند
}

اگر توسعه‌دهنده زیرکلاس جدیدی به سلسله‌مراتب sealed اضافه کند اما پردازش آن را در when فراموش کند — کامپایلر خطا می‌دهد. این امنیت در سطح نوع است که با استفاده از سلسله‌مراتب باز با شاخه else در دسترس نیست.

بر اساس Google Android Developers (2026)، sealed کلاس‌ها روش توصیه‌شده برای مدل‌سازی حالت UI در Jetpack Compose هستند. بررسی جامع when از وضعیت‌هایی جلوگیری می‌کند که توسعه‌دهنده همه گزینه‌های ممکن نمایش صفحه را پردازش نکرده است.

مقایسه sealed class با enum class

enum class و sealed class اغلب اشتباه گرفته می‌شوند، اما اهداف و قابلیت‌های متفاوتی دارند.

ویژگیsealed classenum class
نمونه‌هاچندین (data class)، یکی (object)دقیقاً یکی برای هر ثابت
ویژگی‌هامتفاوت برای هر زیرکلاسیکسان برای همه ثابت‌ها
ارث‌بریبله (از sealed class)خیر (implicit final)
سازندهمی‌تواند پارامتر داشته باشدفقط مشترک برای همه ثابت‌ها
سلسله‌مراتبمحدود، sealedمجموعه ثابت ثابت‌ها

انتخاب بین sealed class و enum class به وظیفه بستگی دارد. اگر گزینه‌ها داده اضافی ندارند — از enum استفاده کنید. اگر هر گزینه شامل فیلدهای منحصربه‌فرد است — از sealed class یا sealed interface استفاده کنید.

سناریوهای عملی کاربرد

sealed انواع در پروژه‌های Kotlin برای سناریوهای استانداردی که نیاز به مدل‌سازی با امنیت نوع دارند استفاده می‌شوند.

حالت UI در Jetpack Compose

هر صفحه Compose می‌تواند sealed class UiState داشته باشد که همه حالت‌های ممکن را توصیف می‌کند: Idle, Loading, Content(data), Error(exception). عبارت when تضمین می‌کند که همه حالت‌ها پردازش شده‌اند.

نتیجه درخواست‌های شبکه

NetworkResult با گزینه‌های Success, Error, Loading — الگوی استاندارد در پروژه‌های Kotlin با Retrofit و Ktor است. sealed class پردازش ایمن هر نتیجه درخواست را تضمین می‌کند.

ناوبری در پروژه‌های multi-module

sealed interface برای مسیرهای ناوبری به ماژول‌ها اجازه می‌دهد مسیرهای خود را در چارچوب یک سلسله‌مراتب واحد اعلام کنند. این خطاهای مربوط به مسیرهای ناشناخته را در زمان کامپایل حذف می‌کند.

بر اساس KotlinConf (2025)، sealed class و sealed interface اساس طراحی type-safe در برنامه‌های مدرن Kotlin هستند. آنها با data class برای مدل‌سازی ساختارهای دامنه پیچیده بدون از دست دادن امنیت در زمان کامپایل ترکیب می‌شوند.

سوالات متداول

زیرکلاس‌های sealed class کجا باید اعلام شوند؟

همه زیرکلاس‌های مستقیم sealed class باید در همان فایل اعلام شوند. برای sealed interface نیز همین قانون — پیاده‌سازی‌ها در یک فایل.

آیا sealed interface می‌تواند در فایل دیگری پیاده‌سازی شود؟

خیر، قانون یک فایل برای sealed interface نیز اعمال می‌شود. همه پیاده‌سازی‌ها باید در فایلی باشند که sealed interface در آن اعلام شده است.

تفاوت بین sealed class و sealed interface چیست؟

sealed interface حالت و سازنده ندارد و امکان پیاده‌سازی چندگانه را فراهم می‌کند. sealed class می‌تواند سازنده و حالت مشترک داشته باشد، اما یک کلاس فقط می‌تواند از یک sealed class ارث‌بری کند.

sealed کلاس‌ها چگونه در عبارت‌های when کمک می‌کنند؟

کامپایلر کامل بودن when را بررسی می‌کند: اگر همه زیرکلاس‌ها پردازش نشده باشند، کد کامپایل نمی‌شود. این خطاهای runtime را حذف می‌کند و کد را امن‌تر می‌کند.

آیا می‌توان sealed class با سازنده ایجاد کرد؟

بله، sealed class می‌تواند سازنده داشته باشد (به طور پیش‌فرض private). همه زیرکلاس‌ها می‌توانند پارامترها را از طریق super() به این سازنده منتقل کنند.

خلاصه

  • sealed class — سلسله‌مراتب محدود با زیرکلاس‌های شناخته شده در زمان کامپایل
  • sealed interface — جایگزین انعطاف‌پذیر (Kotlin 1.5+) با پشتیبانی از پیاده‌سازی چندگانه
  • when — پردازش جامع با بررسی کامپایلر، else لازم نیست
  • یک فایل — همه زیرکلاس‌ها و پیاده‌سازی‌ها باید در یک فایل با نوع sealed باشند
  • مدل‌سازی — حالت‌های UI, نتایج شبکه, ناوبری, سیستم‌های رویداد
  • امنیت — افزودن زیرکلاس جدید بدون پردازش در when باعث خطای کامپایل می‌شود
  • انتخاب — sealed interface به طور پیش‌فرض ارجح است، sealed class در صورت نیاز به حالت مشترک

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید