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

قبل از شروع این مقاله ترجیحا قسمت اول رو مطالعه کنیدکلاس enumمعنی enum در لغت یعنی شمردن ، پایه ای ترین کاری که شما با enum انجام می‌دید تهیه یک مجموعه از مقادیره ، بر خلاف جاوا در کاتلین enum ها خودشون از جنس class هستند :در شکل بالا enum ما شامل یک سری مقادیر یا نوع هست که وضعیت Network رو شرح میدن ، همچنین شما می‌تونید یک contructor برای enum خودتون ایجاد کنید :در مثال بالا وقتی ما از بین Army ، مقدار Captain رو انتخاب کنیم ، مقدار gun برابر "Beretta Colt" قرار داده میشه ، برای دسترسی به ردیف و اسم هم از توابع زیر استفاده میشه :یکی دیگه از استفاده های enum برای ساخت کلاس های بی نام و نشان (anonymous) هست ، در این حالت شما در بدنه enum یک سری توابع abstract رو می‌نویسد و بعد در عناصر enum (در همه شون) اون رو override می‌کنید (تابع رو باید انتها بنویسید و اون سمیکالن ته رو هم باید بذارید) :نکته : گفتیم enum ها خودشون کلاس هستند ، پس آنچه در کلاس انجام می‌دید اینجا هم می‌تونید انجام بدیدکلاس innerوقتی شما در بدنه یک class بیایید یک class دیگه تعریف کنید بهش می‌گیم nested ، حالا می‌تونیم این کلاس nested رو با کلمه inner مشخص کنیم ، وقتی کلمه inner رو میذاریم حالا می‌تونیم از کلاس nested به کلاس outer (کلاس اصلی) دسترسی پیدا کنیم و مقادیر و توابعش رو استفاده کنیم :کلاس inlineقبل از اینکه به سراغ کلاس inline برویم ، به سراغ تابع inline می‌‍ریم ، وقتی شما یک تابع تعریف می‌کنی این تابع حافظه اشغال می‌کنه و یک سری پردازش مخصوص به خودش رو باید انجام بده ، بعضی وقت ها شما توابعی رو تعریف می‌کنید که لزوما نیاز ندارند تابع باشند ، یعنی می‌تونن مستقیم تو خود کد نوشته بشن پس اینجا یک حافظه بی‌خودی گرفته میشه ، برای اینکه این مساله حل بشه از توابع inline استفاده میشه ، وقتی شما تابع رو inline بکنید ، کامپایلر هر وقت اون تابع صدا زده بشه میاد بدنه اون تابع رو جایگزین می‌کنه با جایی که تابع صدا زده شده :کلاس inline هم تقریبا مفهوم مشابهی داره و بهبود های حافظه در استفاده از این کلاس صورت می‌گیره ، این کلاس یک سری شرایط داره :تابع init ندارهدر constructor فقط یک متغیر می‌تونید تعریف کنید (که باید val باشه)در توابع set و ... نمی‌تونید از field استفاده کنید ، به طور یعنی setter خاصی نمیشه تعریف کرد و متغیرها باید val باشندحتما باید final باشه پس کلاس های دیگه حق ارث بری ازش رو ندارندخب چرا ما باید با وجود این همه محدودیت از این کلاس استفاده کنیم ؟ یک مثال در این زمینه می‌زنیم ، فرض کنید یک کلاس به اسم Item دارید ، این کلاس چند متغیر مثل اسم ، رنگ و قیمت رو داره ، حالا این قیمت هم می‌تونه به ریال باشه هم تومن ، یک راه پیاده سازی به شکل زیره :اما اضافه کردن دو تا کلاس می‌تونه بخش زیادی از حافظه رو درگیر کنه ، پس می‌آییم به این شکل درش میاریم :چیزی که کامپایلر موقع اجرای این کلاس می‌بینه به این شکله (شکل پایین رو نگاه کنید و با توجه به اون فکر کنید که چرا نمی‌تونیم بیشتر از دو متغیر در کلاس inline داشته باشیم) :نوعِ Objectبرخی اوقات نیاز داریم یک تعریف کلی از یک کلاس داشته باشیم بدون آنکه نوعی برای اون تعریف کنیم ، مثلا فرض کنید یک interface دارید ، می‌خواید از اون Interface (یا کلاس عادی یا ...) یک کلاس بگیرید و کلاس گرفته شده رو به یک شئ پاس بدید ، اینجا با استفاده از کلمه object یک کلاس بی نام و نشون می‌سازیم و کاری که می‌خوایم رو باهاش می‌کنیم :در مثال بالا می‌تونید به جای اینکه object رو صرفا از یک Interface بگیرید ، از چندین interface بگیرید و حتی تا یک کلاس رو بهش ارث بری بدید (یادآوری که در جاوا و کاتلین ارث بری چندگانه نداریم) ، حالا فرض کنید صرفا یک کلاس کوچولو می‌خوایم و قصد تعریفش رو نداریم :نکته ای که باید در این مورد رعایت کرد اینه که دسترسی به متغیر ها در مثال بالا فقط وقتیه که اون object به صورت local (مثل همین عکس بالا) یا private باشه ، اگه public باشه حق دسترسی نداریم :حالت دیگه اینه که یک کلاس کلی می‌خوایم که کلا یک instance ازش در برنامه وجود داشته باشه (مثلا مثل Singleton) :شما داخل یک object حق تعریف یک object دیگه رو دارید (مثل عکس بالا) ولی داخل یک class حق این کارو ندارید ، برای اینکه بتونیم داخل یک class یک object تعریف کنیم از companion object استفاده می‌کنیم (مثل static کردن یک تابع یا متغیر در جاوا) :اگر دقت کنید برای دسترسی به doSomething مثل یک object عمل شد و نیازی به Instance گیری از MyClass نبود ولی برای دسترسی به doMyClassThing نیازه که یک شئ بگیریم ، بنابراین جلوی MyClass پرانتزی گذاشتیم تا constructor صدا زده بشه و یک شئ از MyClass گرفته بشه و بعد بتونیم به doMyClassThing دسترسی پیدا کنیم ، شما همچنین می‌تونید این companion object رو از چیزای دیگه ارث بگیرید (مثلا از یک Interface یا ...) ، در مورد singleton قبلا یک مقاله ای گذاشته بودم که برای فهم بهتر می‌تونید اونو بخونید .من رو در لینکدین و اینستاگرام دنبال کنید ???اگه دوست داشتید می‌تونید به صفحه Spotify بنده هم برید و موسیقی های منو گوش بدید ???