توضیحات
کلاس های sealed در کاتلین به منظور جلوگیری از ارث بری در خارج از پکیج یا ماژول طراحی شدن؛ کلمه ی sealed به معنی مهر و موم شده است.
به عبارت دیگه هیچ subclass مستقیمی برای این کلاس ها در خارج از پکیج یا ماژول قابل تعریف نیست.
ابتدای این کلاس ها کلیدواژه ی sealed میزاریم و بقیشو مثل کلاس معمولی تعریف می کنیم:
sealed class MyClass {
...
}
بررسی کاربرد ها و ویژگی ها
همینطور که گفتیم sealed دسترسی به کلاس رو محدود به یک پکیج در برنامه می کنه. با این کار علاوه بر اینکه کد های برنامه منظم و خواناتر میشه فرض کنید میخوایم یک api عمومی از برنامه بدیم بیرون کلاس هایی که با sealed تعریف می کنیم به طور مستقیم برای توسعه دهنده قابل دسترسی نیستند.
کلاس های sealed ابستراکت هستند بنابراین به طور مستقیم نمیتونیم ازشون آبجکت ایجاد کنیم.
باید سطح دسترسی کانستراکتور های کلاس سیلد protected یا private باشه.
فرض کنید حیوون خونگی داریم و میخوایم بهشون غذا بدیم اما نمیخوایم این غذا رو به حیوونای دیگه این غذا رو بدیم بنابراین برای غذا کلاس sealed تعریف می کنیم:
fun main() {
val myCat = PetFood.MyCat()
val myDog = PetFood.MyDog()
myCat.feeding()
myDog.feeding()
}
sealed class PetFood private constructor(){
abstract fun feeding()
class MyCat : PetFood() {
override fun feeding() {
println("I'm Feeding my cat!")
}
}
class MyDog: PetFood(){
override fun feeding() {
println("I'm feeding my dog!")
}
}
}
در بالا سطح دسترسی کانستراکتور کلاس PetFood به صورت private تعریف شده بنابراین فقط کلاس های تودرتو میتونن از کلاس PetFood ارث بری داشته باشن که در مورد فوق دو کلاس MyDog و MyCat رو به صورت تو در تو تعریف کردیم.
یکی از ویژگی کلاس های sealed کاربرد اونا در عبارت when است به این صورت وقتی که ساب کلاس هاشونو در when بررسی می کنیم در آخر عبارت نیاز به استفاده از else نداریم.
fun main(){
val myCat = PetFood.MyCat()
val myDog = PetFood.MyDog()
printHungryPetVoice(myCat)
myCat.feeding()
printHungryPetVoice(myDog)
myDog.feeding()
}
fun printHungryPetVoice(petFood: PetFood){
when(petFood){
is PetFood.MyCat -> println("Meow")
is PetFood.MyDog -> println("Barking")
}
}
خلاصه
- کلاس های sealed در خارج از پکیج به طور مستقیم برای ارث بری در دسترس نیستند.
- کلاس های sealed در کاتلین ابسترکت هستند
- سطح دسترسی کانستراکتور های این کلاس ها یا protected باید باشه یا private.
- ساب کلاس های این کلاس ها کاملا با عبارت when برای بررسی سازگاری دارن و نیاز به else اخر شرط نداریم.