کاربرد Sealed Classes

پرسیده شده
فعالیت 1251 روز پیش
دیده شده 954 بار
0

سلام Sealed Classes در کاتلین  چیه و کجا کاربرد دارد؟

فایل پیوست

علی خدری
علی خدری

4 آذر 99

2
حذف شده

سلام و احترام

 

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 باشد و کافی است که هر دو داخل یک فایل قرار داشته باشند.

این متن رو من از جای دیگه کپی کردم که این دوستمون نام حقیقیی نداشتن اما بنظرم به خوبی این موضوع رو توضیح دادند.

برای اینکه بهتر موضوع رو متوجه شید این دو مقاله زیر هم پیشنهاد میکنم بخونید.

https://www.raywenderlich.com/۷۵۴۷۷۳۹-kotlin-and-android-beyond-the-basics-with-sealed-classes

https://virgool.io/@ramtintoosi/eum-vs-sealed-in-kotlin-qwg۲lnwuydtg

 

 

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

4 آذر 99