فهرست
1 - مقدمه
2 - مبانی کاتلین
3 - کد نویسی مقدماتی کاتلین
3.4 ) عبارت های شرطی در کاتلین
3.5 ) اضافه کردن پگیج ها در کاتلین و خلاصه بخض سوم
4 - توابع
4.2 ) تابع با پارامترهای پیشفرض و نامیده شده
4.3 ) تابع با پرامترهای نامحدود و خلاصه بخش چهارم
5 - کلاس ها
5.3 ) visibility modifier ها در کاتلین
5.6 ) Object ها در کاتلین و خلاصه بخش پنج
6 - ارث بری
6.2 ) کارکردن با کلاس های abstract در کاتلین
6.3 ) کلاس های interface در کاتلین
6.4 ) نگاه کوتاه به generic ها و خلاصه بخش شش
7 - کارکردن با Null ها
7.1 ) null safety و خلاصه بخش هفت
8 - نکات اضافه
8.4 ) کار کردن با exception ها
8.6 ) annotation ها در کاتلین و خلاصه بخش هشت
9 - نگاه functionalای
9.2 ) عبارت های لاندا در کاتلین
9.4 ) عبارت های الحاقی در کاتلین و خلاصه بخش نهم
10 - قابلیت همکاری و Interoperability
10.2 ) صحبت کردن با جاوا از کاتلین
10.3 ) کار کردن با null ها از جاوا
10.4 ) صحبت کردن با کاتلین از جاوا
10.5 ) توابع و خصیصه های درجه اول
10.6 ) توابع الحاقی کاتلین از جاوا
10.7 ) همکاری با جاوا 7 و 8 و خلاصه بخش دهم
11 - کتابخانه استاندارد
11.1 ) کتابخانه استاندارد کاتلین و کارکردن با کالکشن ها در کاتلین
11.2 ) مرور کوتاه بر روی filtering و mapping و flatmapping در کاتلین
کلاس های enum در کاتلین
رسیدم به بخش Enum که ساختشون راحت و استفاده ازشون راحت تر. به عنوان مثال کد زیر رو نگاه کنید.
enum class Priority {
MINOR,
NORMAL,
MAJOR,
CRITICAL
}
fun main(args: Array<String>) {
val priority = Priority.NORMAL
println(priority)
}
خب حالا اگه من بیام و priority رو پرینت کنم چی میشه؟ ( با فشار دادن دکمه اجرا میتونین نتیجه رو ببینین)
در اینجا کاتلین به صورت دیفالت میاد و مقدار اون enum رو به String تبدیل و چاپ میکنه.
خب حالا فرض کنین میخوایم هر کدوم از enum هامون یک مقدار داشته باشن، یعنی یک خصیصه داشته باشیم به نام value و مثلا وقتی به NORMAL دسترسی پیدا کردیم، مقدار اونو بخونیم.
enum class Priority(val value : Int ) {
MINOR(-1),
NORMAL(0),
MAJOR(1),
CRITICAL(10)
}
fun main(args: Array<String>) {
val priority = Priority.NORMAL
println(priority.value)
}
همچنین ما میتونیم از کامپایلر بخوایم که بهمون بگه این enum ای که ما میخوایم بهش دسترسی داشته باشیم چندمین enum توی کلاس خودشه.
enum class Priority(val value : Int ) {
MINOR(-1),
NORMAL(0),
MAJOR(1),
CRITICAL(10)
}
fun main(args: Array<String>) {
val priority = Priority.NORMAL
println(priority)
println(priority.value)
println(priority.ordinal)
}
همچنین ما خصیصه name رو داریم
enum class Priority(val value : Int ) {
MINOR(-1),
NORMAL(0),
MAJOR(1),
CRITICAL(10)
}
fun main(args: Array<String>) {
val priority = Priority.NORMAL
println(Priority.CRITICAL.name)
}
که اگه برنامه ران بشه، بهمون CRITICAL رو برمیگردونه.
فرض کنین که میخوایم تموم enum های داخل کلاس رو لیست کنیم
enum class Priority(val value : Int ) {
MINOR(-1),
NORMAL(0),
MAJOR(1),
CRITICAL(10)
}
fun main(args: Array<String>) {
for(priorityInList in Priority.values())
println(priorityInList)
}
درواقع تابع values() میاد و یک لیست از تمومی مقدار های داخل کلاس Priority رو بهمون میده.
اگه فرض کنیم بخوایم با استفاده از کلاس به مقدار یک enum دسترسی داشته باشیم از تابع valueOf() استفاده میکنیم
enum class Priority(val value : Int ) {
MINOR(-1),
NORMAL(0),
MAJOR(1),
CRITICAL(10)
}
fun main(args: Array<String>) {
val p = Priority.valueOf("MAJOR")
println(p)
}
خب همونطور که دیدید وقتی یکی از enum هارو پرینت میکنیم در واقع نام اون enum رو برامون پرینت میکنه، همون کاری که با متغیر name انجام میدیم، ولی من میتونم بیام و تابع toString رو override کنم
enum class Priority(val value : Int ) {
MINOR(-1){
override fun toString(): String {
return "Minor priority"
}
},
NORMAL(0),
MAJOR(1),
CRITICAL(10)
}
fun main(args: Array<String>) {
val priority = Priority. MINOR
println(priority)
}
خب، تا اینجا یاد گرفتیم چگونه از توابع و خصیصه های enum استفاده کنیم، حالا بیایم و یک تابع داخل enum بنویسیم
ابتدا بیایم یک abstract داخل enum درست کنیم.
enum class Priority(val value : Int ) {
MINOR(-1){
override fun toString(): String {
return "Minor priority"
}
},
NORMAL(0),
MAJOR(1),
CRITICAL(10) // بر روی این خط، هشداری دریافت خواهید کرد
abstract fun text(): String
}
fun main(args: Array<String>) {
val priority = Priority. MINOR
priority.text()
}
خب اگه این کد رو بزنید متوجه میشید که کامپایلر بهتون ارور میده. یادتونه که گفتم یک جا هست که شما نیاز به نقطه ویرگول دارین ؟ اون اینجاست، بعد از اخرین enum یک نقطه ویرگول بذارین.
enum class Priority(val value : Int ) {
MINOR(-1){
override fun toString(): String {
return "Minor priority"
}
},
NORMAL(0),
MAJOR(1),
CRITICAL(10);
abstract fun text(): String
}
درواقع وقتی شما حتی این نقطه ویرگول رو هم بذارید بازم کامپایلر بهتون ارور میده، البته نه این که ما کار اشتباهی کردیم، بلکه خب اینجا ما دوتا ارور داشتیم. توجه کنین که ما متد abstract رو درست کردیم، پس باید برای همه ی enum های داخل این کلاس این متد رو override کنیم.
enum class Priority(val value : Int ) {
MINOR(-1){
override fun text(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun toString(): String {
return "Minor priority"
}
},
NORMAL(0) {
override fun text(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
},
MAJOR(1) {
override fun text(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
},
CRITICAL(10) {
override fun text(): String {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
};
abstract fun text(): String
}
خب حالا تنها کاری که باید بکنید اینه که برای هر enum بگید تابع مورد نظرتون میخواد چیکار انجام بده و تمام