انواعِ Class ها در کاتلین - قسمت اول

در کاتلین یک Class می تونه انواع مختلفی داشته باشه :

  1. کلاس عادی
  2. کلاس data
  3. کلاس sealed
  4. کلاس enum
  5. کلاس inner
  6. کلاس inline
  7. نوعِ object

کلاس عادی

کلاس عادی از اسمش مشخصه ، عادیه و خیلی چیز خاصی نداره ، تو همه زبان ها هم تقریبا یکیه مفهومش !

کلاسِ Data

این کلاس هم در واقع شبیه کلاس عادیه با این تفاوت که یک سری متدها بهینه شدند، این تیپ کلاس ها همون طوری که از اسمش مشخصه برای Data ها استفاده میشن ، مثلا دیتایی که داره از سمت سرور برمی‌گرده ، مثلا متد equal ، یک تست با هم ببینیم :

می‌بینید که equals در کلاسی که با data مشخص شده جواب صحیح میده ولی برای کلاس عادی نه ! برای کلاس عادی شما خودتون باید equals رو override کنید ، یا یک تابع دیگه مثل toString رو مثال بزنیم :

تو کلاسی که data هست خیلی شیک میاد مقادیر رو چاپ می‌کنه ولی تو کلاس عادی برای محل مموری شئ رو چاپ کرده ، تابع hashCode هم همین طور :

کلاس‌هایی که عادی تعریف شده از نظر سیستم یکی نیستند پس دو تا hash مختلف می‌گیرند ولی کلاس‌های data با اینکه دو شئ مختلفند ولی چون عناصر یکی دارند پس hash یکسان دارند .

یک تابعی هم که در data هست اما در کلاس عادی نیست تابع copy هست (و دیگه نیازی به دیزاین پترن prototype نیست) ، در مثال زیر ما مقدار رو کپی می‌کنیم ولی مقدار a رو تغییر می‌دیم :

و در آخر ، تابعی با فرمول componentN ، این تابع که به جای N یک شماره قرار می‌دیم ، عنصر شماره N ام اون کلاس رو در کلاسِ data برمی‌گردونه :

کلاس sealed

کلمه sealed به معنی "مهر و موم شده" هست ، کلاس sealed شبیه یک Enum عمل می‌کنه ولی پیشرفته تر ، تعریف sealed کلاس رو به این صورت میگیم : "یک کلاسِ sealed کلاسی است که امکان ارائه یک سلسله مراتب (hierarchie) محدوده شده را می‌دهد که در آن واحد یک عنوان را انتخاب کنید" ، نفهمیدید ؟ مساله نداره با یک مثال بهتر متوجه میشید ، ببینید در یک کلاسِ sealed ما یک سری subclass هایی رو قرار می‌دیم ، مثلا :

ساختمان یک sealed class به این صورته که بعد از نوشتن اسم کلاس درون بلاکِ مربوط به sealed class یک سری class تعریف می‌کنیم ، حالا زمان مقداری دهی می‌تونیم بر اساس شرایط از یکی از این کلاس ها شئ بگیریم .

تو کد بالا sealed class ما میشه NetWorkRespone ، این کلاس وظیفه داره وضعیت response رو مشخص کنه ، ما سه نوع وضعیت داریم ، NoInternet ، AnohterError و MyResponse . بر اساس ورودی ما مشخص می‌کنه که متغیر response چه مقداری رو داشته باشه ، می‌بینیم که اولش چون NoInternet گذاشتیم تشخیص داده که از جنس NoInternet هست و بعدش که وضعیت رو تغییر دادیم می‌بینیم که از جنس AnohterError شد .

اگه دقت کنید یکی از فواید sealed کلاس ها در نگه داری وضعیت ها هستند ، مثلا همین مثالی که دیدیم وضعیت response رو بر حسب شرایط تغییر داده ، یک مثال دیگه ببینیم :

توی این مثال یکمی قضیه فرق کرد ، اولا که ما این دفعه کلاس های داخلیمون رو از خودِ MyState ارث بردیم ، ثانیا دومین آیتم class نیست بلکه object هست ، توی این حالت نیازی به استفاده از "is" نیست (البته می‌تونید هم بذارید ، دلیل اختیاری بودنش هم اینه که object یک نوع یونیک هست ، یعنی از هر object ها واحد هستند (single static instance) ، اگر متوجه نشدید در سری دوم این مقاله که روزهای آینده خواهم نوشت بیشتر object رو مورد بررسی قرار می‌دیم .


باقی انواع کلاس ها رو در سری دوم مقاله بررسی می‌کنیم (به زودی ...)


من رو در لینکدین و اینستاگرام دنبال کنید ???

اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???