خانه » Kotlin » اندروید با kotlin » اندروید با kotlin قسمت دوم – Kotlin Syntax (کلاس Class)

اندروید با kotlin قسمت دوم – Kotlin Syntax (کلاس Class)

در قسمت قبلی آموزش : Android با kotlin قسمت اول Hello World   کار با زبان kotlin رو شروع کردیم، و بخش هایی از اون رو هم توضیح دادم

در این پست بیشتر با syntax اون آشنا میشیم

 

کلاس (Class)

تعریف کلاس

از تعریف کلاس ها شروع کنیم که تغییراتی نسبت به Java داشته :

اول اینکه، میتونید توی یک فایل ، بشتر از یک کلاس رو داشته باشید ، مثلا میتونید تمام کلاس های مدل رو داخل فقط یک فایل بنوسید.

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

حالا، اگر کلاس ما فقط یک آبجکت خالی باشد، تا همینجا کافی هست و نیازی به {} کروشه باز و بسته بعد اون نیست .

به مثلا زیر توجه کنید :

class ClassWithEmptyBody

class ClassWithBody(val name: String) {
    val nameLength = name.length
}

در این فایل ۲ کلاس نوشته شده، کلاس اول ClassWithEmptyBody که یک کلاس با بدنه خالی هست و کلاس دوم که شکلی عجیب برای ما جاوا کار ها داره

در اینجا ، کلاس هم مثل توابع مقادیر ورودی رو توی پرانتز گرفته و دقیقه بعد از اسم کلاس

خوب بهتره فرض کنیم که با این کار نوشتن constructor رو راحت تر کردن، دیگه نیاز نیست یک متد دیگه بنویسیم تا مقادیر رو دریافت کنه و بعد مقادیر رو set کنیم، همینجا هرچی لازمه رو میگیریم

هرچند در صورتی که نیاز باشه به داشتن چند constructor هنوز هم امکان اضافه کردن اون هست

خوب در این کد، برای ساختن یک آبجکت از کلاس نیاز هست که یک name با نوع String به کلاس داده شود، خوب دقت کنید در خط بعدی و در بدنه کلاس ، از name استفاده شده و طول اون رو در متغیری به اسم nameLength ذخیره شده.

 

حالا مثال کامل تری رو در زیر ببینید:

class ClassWithoutConstructorKeyword (val name: String) {
    val nameLength = name.length
}

class ClassWithConstructorKeyword constructor (val name: String) {
    val nameLength = name.length
}

class ClassWithAccessModifier public constructor (val name: String) {
    val nameLength = name.length
}

class ClassWithInitialization public constructor (val name: String) {
    val nameLength : Int

    init {
        nameLength = name.length
    }
}

class ClassWithMultipleConstructors (val name: String) {
    val nameLength = name.length

    constructor(name: String, age: Int) : this(name) {
        val yearOfBirth = LocalDateTime.now().year - age
    }
}

میتونید از کلمه constructor قبل از پرانتز در جلوی نام کلاس استفاده کنید، اما کاملا اختیاری بوده و نبودش هم هیچ ضرری نداره

به کلاس ClassWithInitialization توجه کنید:

در این کلاس در بدنه کلاس init رو می بینیم که بعد اون {} کروشه باز و بسته هست، در واقع این متد، کار بدنه constructor رو انجام میده و اولین بلوک از کدی هست که بعد از ساخته شدن کلاس و مقدار گیری constructor به صورت خودکار صدا زده و اجرا می شود.

حالا به آخرین کلاس یعنی ClassWithMultipleConstructors توجه کنید:

این کلاس ۲ تا constructor داره، یکی پرانتزی که در مقابل نام کلاس هست و ورودی name رو میگیره ، و دیگری در داخل بدنه کلاس جایی که نوشته شده constructor و ۲ مقدار name و age رو می گیره

در constructor دوم پس از پرانتز عبارت this نوشته شده و مقدار name به اون فرستاده شده، که در واقع این مقدار به constructor اصلی کلاس که جلوی نام کلاس نوشته شده ارسال می شود، پس همیشه یک constructor اصلی وجود داره که حتما باید مقدار دهی بشه و اون هم مقادیری که در پرانتز جلو نام کلاس گرفته می شوند هست.

حتما constructor  های دیگر باید مقادیر مورد نیاز constructor  اصلی رو به اون و با عبارت this بفرستند (مانند مثال بالا)

 

نکته آخر در مورد کلاس و constructor اون، این هست که مقادیر داخل constructor  رو میتونید قبلشون val یا var رو بنویسید یا ننویسید، اگر var یا val رو ننویسید در داخل کلاس مقادیر در دسترس نیستند و نمیتونید از اون ها استفاده کنید، اما اگر بنویسید در واقع مثل این میمونه که مقادیر رو با constructor گرفتید و اون هارو داخل یک متغیر مقدار دهی کردید مقل this.name = name که در جاوا برای constructor  ها انجام می دادیم، اینجا فقط با نوشته var یا val ابتدای اسم متغیر در constructor  اون رو در داخل کل کلاس در دسرس قرار میدید.

چه فایده ای داره ننوشتنش ؟! خوب بعضی وقت ها فقط نیاز هست یک متغیر رو بگیریم و به کلاس super (والد) ارسال کنیم و نیازی به استفاده از اون ها داخل کلاس نداریم ، اون موقع دیگه var یا val رو نمینویسم.

فرق var با val چیه ؟!

var متغیر هایی هستند که به دفعات مقدارشون میتونه تغییر کنه اما val فقط یکبار مقدار می گیره و در واقع readOnly هستش.

 

 

ساختن یک Instance از کلاس

خوب حالا اگر بخوایم یک Instance از کلاس ها بسازیم، جالبش اینه که میشه از همین کلاس در کنار کلاس های جاوا استفاده کرد، مثلا اگر در MainActivity.java بخوایم از کلاسی که در بالا تعریف کردیم ClassWithEmptyBody ، یک instnace بسازیم خوب مثل زیر عمل می کنیم:

ClassWithEmptyBody myClassWithEmptyBody = new ClassWithEmptyBody()

اما اگر بخوایم از اون داخل یک فایل به زبان Kotlin استفاده کنیم مثلا در MainKotlinActivity.kt به صورت زیر عمل می کنیم:

val myClassWithEmptyBody = ClassWithEmptyBody()

val myClassWithBody = ClassWithBody("a name")

میبینید که new رو دیگه نیاز نیست بنویسیم ، همینطور نوع متغیر رو هم نیاز به تعریف نیست و به صورت خودکار نوعش تعریف میشه، فقط کافیه از var یا val در ابتدای خط استفاده کنیم که یعنی قصد تعریف یک متغیر جدید داریم.

 

ارث بری

خوب برای ارث بری دیگه نیازی به نوشته کلمات extends و implements نیست و فقط از عبارت : استفاده می کنیم، به مثلا توجه کنید :

open class ParentClass (someNumber: Int)

class ChildClass (someNumber: Int) : ParentClass(someNumber)


interface InterfaceExample {
    fun test()
}

class InterfaceImplementation : InterfaceExample {
    override fun test() {
        //Some implementation
    }
}

ابتدا کلاسی با یک ورودی تعریف شده که بدنه ای هم نداره : open class ParentClass (someNumber: Int)

سپس در خط بعدی از این کلاس به این شکل ارث بری شده:

class ChildClass (someNumber: Int) : ParentClass(someNumber)

میبینید که از کلمه extends استفاده نشده و فقط از : استفاده شده و همینطور که در بالاتر هم گفتم مقادیر constructor کلاس ChildClass عبارت var یا val ندارد و فقط مقادیر رو به کلاس ParentClass میفرستد.

این کلاس هم بدنه ای ندارد پس نیازی به نوشتن {} نیست.

نکته: اگر دقت کرده باشید عبارت open رو در پیش از عبارت class در کلاس ParentClass میبینید، در kotlin به صورت پیش فرض امکان ارث بری از هر کلاسی وجود ندارد و اگر open رو ننویسیم در خط بعدی اجازه ارث بری نمی دهد، پس برای اینکه کلاس ما قابلیت ارث بری داشته باشد باید از open در ابتدای اون استفاده کنیم.

 

خوب حالا خط بعدی یک interface رو می بینیم که اون هم در کلاس بعدیش با : استفاده شده و باز هم implements حذف شده و اینکه در kotlin @Override رو نداریم و باید پیش از نام توابه از ovveride استفاده کنیم.

 

خوب امیدوارم این آموزش هم مفید بوده باشه.

 

قسمت بعدی آموزش: اندروید با kotlin قسمت سوم – Kotlin Syntax (توابع Functions)

 

لینک آموزش مرتبط: https://medium.com/@jcmsalves/kotlin-syntax-part-i-why-am-i-excluded-86772a61fade

برچسب ها:
پست قبلی
پست بعدی

درباره ایلیا عابدینی

برنامه نویس اندروید و کارشناس مهندسی پزشکی، نفر سوم مسابقه برنامه نویسی اندروید http://www.schallenge.ir ، از سال 92 برنامه نویسی اندروید رو شروع کردم و در حال حاضر در شرکت عصر دانش در حال توسعه اپلیکیشن تجارت پی می باشدم ، این وبلاگ رو ساختم تا تجربیات روزانه و مفید خودم رو داخل اون بزارم. رزومه : iact.ir/cv

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نمی شود.علامت دارها لازمند. *

*

رفتن به بالا