فروش ویژه سرور اختصاصی
ماکرونت: همه چیز درباره sealed کلاسها در کاتلین
- دی 17, 1401
- 0
- ملیحه ایزی
کلاس های sealed
در کاتلین، کلاس sealed
کلاسی است که می تواند تعداد محدودی پیاده سازی داشته باشد. sealed
کلاس ها نشان دهنده سلسله مراتب کلاس های محدودی هستند که کنترل بیشتری بر وراثت ارائه می دهند. تمام زیر کلاس های مستقیم یک کلاس مهر و موم شده در زمان کامپایل شناخته می شوند. هیچ زیرکلاس دیگری در خارج از ماژولی که کلاس مهر و موم شده در آن تعریف شده است ظاهر نمیشود. افراد نمی توانند کلاس مهر و موم شده شما را در کد خود گسترش دهند. بنابراین، هر نمونه از یک کلاس مهر و موم شده دارای یک نوع از یک مجموعه محدود است که هنگام کامپایل شدن این کلاس شناخته می شود.
کلاس های sealed
در کاتلین به روش زیر اجرا می شود:
}sealed class A
class B : A()
class C : A()
}
سازندگان(Constructors) یک کلاس sealed
در حالت کلی می تواند protected
(by default) or private
باشد. همه زیر کلاس های یک کلاس sealed
باید در یک فایل اعلان شوند.
مقایسه با enum
به نوعی، کلاسهای sealed
مشابه کلاسهای enum هستند: مجموعه مقادیر برای یک نوع enum نیز محدود است، اما کلاسهای Enum فقط یک نوع را برای همه ثابتها اجازه میدهند در صورتی که کلاس های sealed
با اجازه دادن چندین نمونه به کمک ما می آیند.
}sealed class Months
class January(var shortHand: String) : Months()
class February(var number: Int) : Months()
class March(var shortHand: String, var number: Int) : Months()
}
چگونه می توانید از این ویژگی کلاس های sealed
در پروژه های خود استفاده کنید؟ در برنامههایی مانند فید خبری، میتوانید سه نوع کلاس مختلف برای پستهای Status، Image، Video مانند شکل زیر ایجاد کنید.
sealed class Post
}
class Status(var text: String) : Post()
class Image(var url: String, var caption: String) : Post()
class Video(var url: String, var timeDuration: Int, var encoding: String): Post()
}
در صورتی که این مورد در enum امکان پذیر نیست.
کلاسهای sealed
معمولاً با عبارات When استفاده میشوند، زیرا هر یک از زیر کلاسها و انواع آنها به عنوان case عمل میکنند. علاوه بر این، می دانیم که کلاس Sealed انواع را محدود می کند. از این رو، قسمت دیگر دستور when را می توان به راحتی حذف کرد همچنین روشی امن برای رسیدگی به موارد مختلف ایجاد می کند.
مثال زیر همین را نشان می دهد:
}sealed class Shape
class Circle(var radius: Float): Shape()
class Square(var length: Int): Shape()
class Rectangle(var length: Int, var breadth: Int): Shape()
}
fun eval(e: Shape) =
}when (e)
is Shape.Circle -> println("Circle area is ${3.14*e.radius*e.radius}")
is Shape.Square -> println("Square area is ${e.length*e.length}")
is Shape.Rectangle -> println("Rectagle area is ${e.length*e.breadth}")
}
در این مثال، کلاس Shape یک کلاس sealed
است و دارای سه زیر کلاس می باشد: Circle، Rectangle وSquare. کلاس Shape فقط توسط این سه زیر کلاس در یک فایل قابل گسترش است. این بدان معنی است که اگر بخواهید یک زیر کلاس چهارم Shape را در یک فایل متفاوت ایجاد کنید، کد کامپایل نمی شود.
بیایید تابع eval را مطابق شکل زیر در تابع اصلی خود اجرا کنیم:
}fun main(args: Array)
var circle = Shape.Circle(4.5f)
var square = Shape.Square(4)
var rectangle = Shape.Rectangle(4,5)
eval(circle)
eval(square)
eval(rectangle)
//eval(x) //compile-time error.
}
//Following is printed on the console:
//Circle area is 63.585
//Square area is 16
//Rectangle area is 20
یکی از مزایای اصلی استفاده از کلاسهای sealed
این است که به شما امکان میدهند عبارت when را با ایمنی و اختصار بیشتر استفاده کنید. از آنجا که تعداد زیر کلاسها مشخص و محدود است، عبارت When میتواند جامع باشد، به این معنی که تمام موارد ممکن را پوشش میدهد. این موضوع نیز به کامپایلر اجازه می دهد تا اشتباهات را در زمان کامپایل تشخیص دهد و به جلوگیری از خطاهای زمان اجرا کمک کند.
یک مثال دیگر:
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
در این مثال، کلاس Expr یک کلاس sealed
است و دارای سه زیر کلاس Const، Sum و NotANumber است. کلاس Expr فقط می تواند یکی از این سه مقدار را داشته باشد.
برای هندل کردن موارد مختلف یک کلاس sealed
می توانید از عبارت When استفاده کنید:
}fun eval(expr: Expr): Double = when(expr)
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
}
در این مثال، تابع eval نمونه ای از کلاس Expr را به عنوان آرگومان می گیرد و از عبارت when برای ارزیابی عبارت بر اساس نوع آن استفاده می کند. اگر عبارت Const باشد، تابع مقدار فیلد عدد را برمیگرداند. اگر عبارت یک Sum باشد، تابع به صورت بازگشتی فیلدهای e1 و e2 را ارزیابی کرده و مجموع آنها را برمی گرداند. اگر عبارت NotANumber باشد، تابع Double.NaN را برمی گرداند.
امیدوارم این مقاله برای شما دوست عزیز مفید واقع شده باشد، سوالات یا موضوعات مرتبط را می توانید از طریق کامنت ها با ما درمیان بگذارید.
«ملیحه ایزی»، فارغالتحصیل مقطع کارشناسی ارشد مهندسی کامپیوتر، گرایش نرم افزار است.
تمامی حقوق برای ماکرونت محفوظ است.