در کاتلین بر خلاف جاوا دست شما در اپراتور ها و استفاده و override کردن شما بازتر هست . بدون مقدمه میریم سراغ اصل داستان و یک به یک انوع اپراتور رو بررسی میکنیم .
اپراتورهای حسابگر (مثلا +) در جاوا برای متغیرهای اصلی (primitive) مثل int و ... استفاده میشه و برای باقی متغیر (به جز یک استثنا که اون هم String هست) قابل استفاده نیست .
اما در کاتلین اینطور نیست ، شما میتونید این operator رو override کنید و برای انواع کلاس ها استفاده کنید ، برای مثال همین اپراتور + ، وقتی شما قصد override کردن یک اپراتور رو دارید باید معادل لغوی اون اپراتور رو بدونید (مثلا برای + میشه plus) ، بعد تابع plus رو تعریف کنید و قبل از کلمه fun کلمه operator رو استفاده کنید . برای مثال کلاس A رو داریم که یک متغیر Int درون خودش داره ، ما میخوایم اپراتور + رو در دو حالت یکی اینکه دو متغیر از جنس A با هم جمع بشوند و یکی اینکه یک متغیر A با یک Int جمع بشه رو داشته باشیم :
اگر دقت کنید به جای اینکه دوبار اپراتور + رو override کنیم در واقع یک بار هم برای Int به صورت Extended این override رو انجام دادیم ، دلیلش چیه ؟ ساده است ، در کاتلین جا به جایی متغیرها رو وقتی جنس اونها فرق کنند رو متوجه نمیشه ، پس اگر جنس A رو به اضافه Int میکنید یکبار هم باید جنس Int رو به اضافه A کنید !!!
نکته : در جاوا ما این قضیه override کردن اپراتورها رو نداریم پس اگه در کدکاتلین رو در جاوا بخواید استفاده کنید به جای + باید از همون اسم تابع plus استفاده کنید .
نکته : همون طور که برای Int به صورت Extended این عملیات رو انجام دادیم برای هر نوع دیگری هم میتونیم به جای تعریف اپراتور در بنده اصلی کلاس به صورت Extended این کار رو انجام بدیم .
لیست اپراتورهای ریاضی :
نکته : حواستون باشه اگه چند اپراتور رو پشت هم استفاده میکنید ترتیب عمل کردن اونها از همون منطق همیشگی پیروری میکنه ، یعنی مثلا اپراتور ضرب اولیت بالاتری نسبت به + داره
نکته : لازم نیست خروجی این اپراتور ها از جنس خودِ کلاس باشه ، مسلما هر نوع خروجی که در نظر دارید رو میتونید استفاده کنید
اپراتورهای انتصاب ترکیبی ، مثلا اپراتور =+ ، این اپراتور به صورت لغوی plsuAssign معنی میشه و نکته مهم در اونها اینه که خروجی حتما باید Unit باشه .
نکته : این اپراتور ممکنه با اپراتور + یکی تلقی بشه ، یعنی اگه شما هر جفتش رو override کنید به خطا بررخورید (کامپایل تایم) ، پس از یکی از اونجا استفاده کنید .
نکته : هر دو نوع اپراتوری که تا الان بررسی کردیم برای Collection ها (مثلا آرایه) قابل استفاده است . اپراتورهای ریاضی (مثل +) یک Collection جدید رو به عنوان خروجی برمیگردوند :
اپراتورهای یگانه مثلا - پشت یک متغیر ، - در اینجا unrayMinus هست ، این اپراتورها حق گرفتن ورودی رو ندارند و فقط خروجی دارند
لیست این اپراتورها :
نکته : اولیت ++ پشت متغیر بالاتر از بقیه چیزهاست ، تفاوت ++ جلوی متغیر با پشت متغیر در همینه ، مثلا اگه متغیری رو چاپ کنید و درون دستور چاپ پشتش ++ بذارید اول ++ رو انجام میده بعد چاپ ولی اگه جلوی متغیر بذارید اول متغیر رو چاپ میکنه بعد ++
متغیر های مقایسه ای مثل == ، در کاتلین سه تیپ برای مساوی داریم ، یکی == ، یکی === ، یکی هم equals ، در جاوا اپراتور == به اینگونه هست که اگه متغیر primitive باشه مقدار رو چک میکنه و اگه کلاس باشه رفرنس رو (به یک جای حافظه اشاره کردن) ، اما در کاتلین این طور نیست ! در کاتلین == برای مقایسه مقادیر نه رفرنس استفاده میشه و در زیرلایه اون داره همون equals رو صدا میزنه (پس برای override کردنش باید همون equals رو override کرد) ، اما در مورد == شما حتما باید دومتغیر از یک جنس رو با هم مقایسه کنید (ولی در مورد equals این طور نیست) ، حواستون باشه که اگه == رو برای کلاس ها صدا میزنید باید حتما equals رو override کنید وگرنه بهتون false برمیگردونه .
اپراتور === این رو چک میکنه که آیا دو متغیر دارای رفرنس یکسان هستند یا نه ، یعنی به یک جا از حافظه اشاره میکنند یا خیر !
نکته : equals رو نمیتونید به صورت Extended اضافه کنید ، چون این متد متعلق به کلاس Any هست و به هر حال اونی که برای کلاس هست ارجخیت به Extended داره
نکته : === قابل override کردن نیست
در جاوا ما اینترفیسی به نام Comparable داریم که برای مقایسه بین دو متغیر استفاده میشه ، در کاتلین هم این مساله هست با این تفاوت که شما میتونید این قضیه رو تبدیل به اپراتورهای مقایسه مثل < و ... بکنید .
نکته : تابع compareValuesBy یک تابع از کاتلینه که میاد دومتغیر (ورودی اول و دوم) و معیار مقایسه رو (که یک varargs هست (لیستی از متغیرها) میگیره و مقایسه رو انجام میده
نکته : در تابع compareTo اگر خروجی بزرگتر از صفر شود یعنی بزرگتر ، مساوی صفر یعنی مساوی و منفی یعنی کوچکتر
Collection and Range Op.
مسلما با آرایه و لیست کار کردید ، وقتی نیاز به عنصر دوم از آرایه دارید دستوری مثل a[1] رو داریم ، خب این اپراتور [index] رو چطوری باید override کرد ؟ دو اسم get و set برای این قضیه به کار میره .
نکته : set نیاز به یک ورودی علاوه بر index داره ، در مورد اینکه Index ها چی باشند هم میبینید که هر چی دوست داشته باشید میتونید بذارید ، حتی میتونید چندین index داشته باشید !
یکی دیگه از اپراتور ها اپراتورِ in هست که نشون دهنده اینه که یک آیتم عضو یک مجموعه هست یا نه ، برای پیاده سازی in باید تابع contains رو override کنید :
اپراتوری با علامت .. داریم که مشخص کننده رنجی از اعداد هست ، مثلا 10..1 از عدد یک تا ده رو شامل میشه ، برای این اپراتور باید تابع rangeTo رو override کنید :
نکته : اولیت اپراتور .. نسبت به عملیات ریاضی (مثلا +) کمتر است
آدرس کانال تلگرامی ما : لینک
لینک گیت مقاله رو هم در این لینک میتونید ببینید .
من رو در لینکدین ، اینستاگرام و یوتیوب دنبال کنید !!!
اگه دوست داشتید میتونید به صفحه Spotify و SoundCloud بنده هم برید و موسیقی های منو گوش بدید !!!