در این تکلیف شما درباره کلاسهای خاص در کاتلین خواهید آموخت از جمله:
گام ۱: یادآوری کلاس های یگانه
مثال پیشین کلاس GoldColor را به یاد بیاورید.
object GoldColor : FishColor { override val color = "gold" }
چون همه نمونههای GoldColor یک کار را انجام میدهد، به جای class به عنوان object تعریف شد تا آن را یگانه بسازیم. فقط یک نمونه از آن میتواند وجود داشته باشد.
گام ۲: یک کلاس شمارشی (enum) بسازید
کاتلین از شمارشیها پشتیبانی می کند، که به شما اجازه می دهد تا چیزی را بشمارید و با استفاده از نام به آن ارجاع دهید، مثل سایر زبان ها. با استفاده از پیشوند enum یک شمردنی تعریف کنید. یک تعریف پایه شمارشی فقط به لیستی از نام ها نیاز دارد، اما شما همچنین می توانید یک یا چند میدان مرتبط با هر نام تعریف کنید.
۱. در Decoration.kt یک مثال از enum را امتحان کنید.
enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF); }
شمردنی ها کمی مانند کلاسهای یگانه هستند - فقط یکی و فقط یکی از هر مقدار در شمردن وجود خواهد داشت. برای مثال فقط یک Color.RED، یک Color.GREEN و یک Color.BLUE وجود خواهد داشت. در این مثال مقدار های RGB به خصوصیت rgb اختصاص داده شده اند تا اجزا رنگی را مشخص کند. همچنین شما می توانید مقدار ترتیبی یک enum را با استفاده از خصوصیت ordinal و نام آن را با استفاده از خصوصیت name بگیرید.
۲. یک مثال دیگر از کلاس شمارشی را امتحان کنید.
enum class Direction(val degrees: Int) { NORTH(0), SOUTH(180), EAST(90), WEST(270) } fun main() { println(Direction.EAST.name) println(Direction.EAST.ordinal) println(Direction.EAST.degrees) }
⇒ EAST 2 90
گام ۳: یک کلاس مهر شده بسازید
یک کلاس مهر شده (sealed class) کلاسی است که میتواند زیر کلاس شود، اما فقط داخل فایلی که تعریف شده است. اگر بخواهید کلاس را در فایل دیگری زیر کلاس کنید یک خطا می گیرید.
چون کلاس ها و زیر کلاس ها در یک فایل قرار دارند، کاتلین همه زیر کلاس ها را به صورت ایستا می شناسد. در زمان کامپایل، کامپایلر همه کلاس ها و زیر کلاس ها را میبیند و می داند که این همه ی آن ها است،پس کامپایلر میتواند چکهای اضافه برای شما انجام دهد.
۱. در AquariumFish.kt یک نمونه از کلاس مهر شده، با تم آبزیان را امتحان کنید.
sealed class Seal class SeaLion : Seal() class Walrus : Seal() fun matchSeal(seal: Seal): String { return when(seal) { is Walrus -> "walrus" is SeaLion -> "sea lion" } }
کلاس Seal نمیتواند در فایل دیگر زیر کلاس شود. اگر می خواهید انواع Seal دیگری اضافه کنید باید آنها را به همان فایل اضافه کنید. این کلاسهای مهر شده را به یک راه امن برای نمایش تعداد ثابت از انواع تبدیل می کند. برای مثال کلاسهای مهر شده برای برگرداندن موفقیت یا خطا از یک API شبکه عالی هستند.