سلام Sealed Classes در کاتلین چیه و کجا کاربرد دارد؟
سلام و احترام
Sealed نوع پیشرفته enum هست که توی کاتلین وجود داره. به دلیل object بودن هر مقدار (Constant) داخل Enum نمیتوانید چندین نمونه از آنها بگیرید. فرض کنید دو کاربر داریم که برای هر کدام میخواهیم یک روش پرداخت با موجودی متفاوت بسازیم:
fun main() {
val user1 = PaymentMethod.CASH
val user2 = PaymentMethod.CASH
user1.balance = 2_000.00
println("+-----------------------------------+")
println(user1.balance) //Prints 2000.0
println(user2.balance) //Also prints 2000.0
}
enum class PaymentMethod(var balance: Double) {
CASH(147.50),
CREDIT(15.00)
}
برای حل این مشکل از Sealed Classها استفاده میکنیم که دارای ویژگیهای زیر هستند:
یک کلاس Sealed را تنها اعضای آن میتوانند ارث بری (Extend) کنند.
کلاس Sealed یک کلاس abstract میباشد که اعضای آن به عنوان Concrete کلاس شناخته میشوند.
کلاس abstract کلاسی است که نمیتوان از آن شی (Object) ساخت و به همین دلیل کلاسی که از آن ارث بری میکند و فانکشنها و پراپرتیهای abstract (بدون بدنه) آن را پیاده سازی میکند Concrete گفته میشود.
fun main() {
val user1 = PaymentMethod.CASH(2_000.0)
val user2 = PaymentMethod.CASH(9_000.0)
println("+---------------------+")
println(user1.amount)
println(user2.amount)
}
sealed class PaymentMethod(var amount: Double) {
class CASH(cashAmount: Double) : PaymentMethod(cashAmount)
class CREDIT(credit: Double) : PaymentMethod(credit)
data class Crypto(val name: String, val balance: Double) : PaymentMethod(balance)
//object Gift : PaymentMethod(0.0)
}
در یک Sealed Class میتوانید هر نوع ساختاری (data class, class, and object) را پیادهسازی کنید.
در نسخههای جدیدتر کاتلین نیازی نیست که کلاس ارث برنده داخل بدنه Sealed Class باشد و کافی است که هر دو داخل یک فایل قرار داشته باشند.
این متن رو من از جای دیگه کپی کردم که این دوستمون نام حقیقیی نداشتن اما بنظرم به خوبی این موضوع رو توضیح دادند.
برای اینکه بهتر موضوع رو متوجه شید این دو مقاله زیر هم پیشنهاد میکنم بخونید.