کلاس های تو در تو در کاتلین

توضیحات

میتونیم داخل کلاس یک کلاس دیگه تعریف کنیم که بهش کلاس تو در تو یا (Nested Class) میگیم.

به کلاسی که داخلش کلاس تعریف میکنیم کلاس بیرونی یا outer class میگیم.

کلاس های داخلی در کاتلین از قوانین کلیدواژه های سطح دسترسی بقیه ی اعضای کلاس بیرونی پیروی میکنن.

در کاتلین مانند جاوا کلاس های تو در تو به دو دسته ی کلاس استاتیک تو در تو (Static Nested Class) و کلاس غیر استاتیک داخلی (Non-static Inner Class) تقسیم میشن.

در کاتلین علاوه بر کلاس میتونیم اینترفیس رو داخل یک کلاس تعریف کنیم همینطور میتونیم داخل اینترفیس کلاس و اینترفیس تعریف کنیم و محدودیتی وجود نداره.

کلاس استاتیک تو در تو (Static Nested Class) در کاتلین

در کاتلین کافیه یک کلاس معمولی داخل کلاس تعریف کنیم و برای ساخت آبجکت ازش مثل زیر عمل می کنیم:

MyOuterClass.MyInnerClass()

در زیر یک کلاس به عنوان کلاس بیرونی و یک کلاس به عنوان کلاس تو در تو و یک تابع برای چاپ پیام از کلاس تو در تو تعریف کردیم.

fun main(){ val nested = MyOuterClass.MyNestedClass() nested.printMessage() } class MyOuterClass{ ... class MyNestedClass{ fun printMessage(){ println("This is from nested class") } } }

کلاس غیر استاتیک داخلی (Non-Static Inner Class)

برای تعریف کلاس های غیر استاتیک داخلی از کلیدواژه ی inner استفاده میکنیم

این کلاس ها وابسته به آبجکت کلاس بیرونی هستند و به اعضای کلاس بیرونی دسترسی دارن

.برای ساخت ابجکت از این کلاس ها ابتدا یک آبجکت از کلاس بیرونی می‌سازیم و پس از گذاشتن نقطه آبجکت از کلاس داخلی رو ایجاد میکنیم

MyOuterClass().MyInnerClass()

مثال زیر بیانگر دسترسی کلاس داخلی به کلاس خارجی و نحوه ی تعریف کلاس داخلی در داخل کلاس خارجی است.

fun main(){ val outer = MyOuterClass() val inner = outer.MyInnerClass() inner.printMessage() } class MyOuterClass{ fun printOuterMessage(){ println("This is from outer class") } inner class MyInnerClass{ fun printMessage(){ //صدا زدن مستقیم تابع MyOuterClass در MyInnerClass printOuterMessage() println("This is from inner class") } } }

ساخت نمونه از کلاس و اینترفیس های تو در تو به صورت anonymous

میتونیم از کلاس ها و اینترفیس های داخلی توسط کلید واژه ی object به صورت بی نام نمونه بسازیم.

در زیر نشون میدیم چطور setOnClickListener در کلاس View اندروید طراحی شده

fun main(){ val v = View() v.setOnClickListener(object: View.OnClickListener{ fun onClick(v: View){ v.printMessage() } } } class View{ fun printMessage(){ println("This is view the from android!") } fun setOnClickListener(onClickListener: OnClickListener){ onClickListener.onClick(this) } //Nested Interface fun interface OnClickListener{ fun onClick(v: View) } }

خلاصه

- به کلاسی که داخلش کلاس تعریف میکنیم کلاس بیرونی (outer class) میگیم.

- در کاتلین دو نوع کلاس تو در تو داریم: استاتیک تو در تو و غیر استاتیک داخلی.

- کلاس های تو در تو از قوانین سطح دسترسی سایر اعضای کلاس بیرونی پیروی میکنن.

کلاس استاتیک تو در تو رو مثل کلاس معمولی داخل کلاس تعریف می کنیم.

کلاس غیر استاتیک داخلی رو با کلید واژه ی inner تعریف می کنیم.

- کلاس های غیر استاتیک داخلی به تمام اعضای کلاس بیرونی دسترسی دارن.

- میتونیم از کلاس های تو در تو به صورت بی نام (anonymous) آبجکت بسازیم.

arrow_drop_up
کپی شد!