Extension Properties
Kotlin اذن میدهد تا Extension Properties را به متدی بسیار شبیه مانند extension function طراحی اپلیکیشن در مشهد تمجید کنیم.
Extension properties نیز فارغ کلاس تعریفوتمجید گردیده است.
از آنجایی که extensions در واقع جوارح را در کلاسها وارد نمی کنند، هیچ رویکرد موثری برای داشتن یک فیلد backing به extension property نیست.
به همین استدلال میباشد که initializers برای extension properties مجاز نیستند.
میتوانیم getter و setter را به یاور property هایی که چیزی جز extension functions نیستند اضافه کنیم.
class Temperature(var celsius: Float)
fun main(args: Array) {
val t = Temperature(40f)
println(t.fahrenheit)
t.fahrenheit = 85f
println(t.celsius)
}
var Temperature.fahrenheit: Float
get() = (celsius * 9 / 5) + 32
set(value) {
celsius = (value - 32) * 5 / 9
}
COPY
خروجی :
104.0
29.444445
Data Classes
درین نصیب با کلاس های Data در فراگیری کلاس ها و آبجکت های کاتلین بیشتر آشنا می شویم.
اما ما در قسمت های قبل به کرار از آنها اسم بردیم ، البته درین نصیب معنا آنهارا تحقیق خواهیم کرد.
یک کلاس هر فرصت که تحت عنوان “ Data” نماد گذاری خواهد شد میتواند تحت عنوان یک کلاس داده معرفی گردد.
از این نوع کلاس می اقتدار برای جداگانه نگه داشتن داده های اساسی استفاده نمود.
به غیر از این، هیچ همت دیگری ارائه نمی دهد.
آحاد کلاس های داده می بایست یک primary constructor داشته باشند و کل primary constructor می بایست دستکم یک پارامتر داشته باشند.
هر فرصت که یک کلاس تحت عنوان Data آرم گذاری میگردد، میتوانیم از بعضی از تابع های داخلی آن کلاس داده مانند () toString () ، hashCode و … به کار گیری کنیم.
هر کلاس داده ای نمی تواند modifier مانند abstract و open یا این که internal داشته باشد.
کلاس داده را می شود به کلاس های دیگر نیز پیشرفت بخشید.
در نمونه ذیل یک کلاس داده ساختوساز میکنیم.
fun main(args: Array) {
val book: Book = Book("Kotlin", "manataz.com", 5)
println("Name of the Book is--"+book.name) // "Kotlin"
println("Puclisher Name--"+book.publisher) // "manataz.com"
println("Review of the book is--"+book.reviewScore) // 5
book.reviewScore = 7
println("Printing all the info all together--"+book.toString())
//using inbuilt function of the data class
println("Example of the hashCode function--"+book.hashCode())
}
data class Book(val name: String, val publisher: String, var reviewScore: Int)
COPY
قطعه کد بالا خروجی پایین را در مرورگر ساخت می نماید، جایی که ما یک کلاس داده برای حفظ بعضی از اطلاعات ساخت کرده ایم و از تابع اساسی به تمامی اعضای داده آن دسترسی پیدا کرده ایم.
Name of the Book is--"Kotlin"
Puclisher Name--"manataz.com"
Review of the book is--5
Printing all the info all together--(name-Kotlin, publisher-manataz.com, reviewScore-7)
Example of the hashCode function---1753517245
COPY
Generics
مانند جاوا، Kotlin جايگاه بالاتری از تایپ متغیر به اسم Generics را ارائه میدهد.
درین نصیب ، شیوه پیادهسازی Generics و اینکه به چه شکل تحت عنوان یک بسطدهنده خواهیم توانست از امکانهای ارائه گردیده در کتابخانه ژنریک به کارگیری کنیم، خوا هیم فراگرفت.
از دید پیادهسازی، ژنریکها نسبتاًً مشابه جاوا میباشند، البته گسترش دهنده Kotlin دو کلمه و واژه کلیدی تازه out و in را معرفی نموده است تا کدهای Kotlin را برای گسترش دهنده خواناتر و سهل وآسانخیس نماید.
طبق نمونه، List یک کلاس در Kotlin میباشد، در حالی که List یک نوع در Kotlin میباشد.
نمونه ذیل طریق طراحی ژنریک در کاتلین را نشانه میدهد.
fun main(args: Array) {
val integer: Int = 1
val number: Number = integer
print(number)
}
COPY
در کد بالا یکی درست اعلام کردیم و بعداً آن متغیر را به یک متغیر عددی تخصیص دادیم.
این شغل قابلیت و امکان پذیر میباشد چون Int یک تحت کلاس از کلاس Number میباشد، بدین ترتیب تبدیل به صورت اتومات و ریل تایم رخداد می افتد و خروجی را به طور “1” ایجاد می نماید.
اذن دهید چیزهای بیشتری راجع به ژنریک در Kotlin ارائه دهیم.
خوب میباشد هر مجال که از نوع داده ای که قرار میباشد در نرمافزار استعمال کنیم مطمئن نیستیم به سراغ نوع داده generic برویم.
به صورت کلی، ژنریک با تعریفوتمجید می گردد که در آن T مخفف template میباشد، که میتواند به طور پویا بوسیله کاتلین رقم بخورد.
در نمونه پایین روش استعمال از گونه های داده های generic در گویش نرم افزار نویسی Kotlin را خواهیم مشاهده کرد.
fun main(args: Array) {
var objet = genericsExample("JAVA")
var objet1 = genericsExample(10)
}
class genericsExample(input:T) {
init {
println("I am getting called with the value "+input)
}
}
COPY
در کد بالا، یک کلاس با نوع بازگشتی ساختوساز میکنیم که به طور نمایش داده میشود.
به مشی مهم نگاهی بیندازید، جایی که ما به طور پویا مقدار آن را در انجام با ثابت نوع مقدار تمجید کردهایم، در حالی که آبجکت این کلاس را ساخت و ساز می کنیم.
این میباشد که چهگونه ژنریک بوسیله کامپایلر Kotlin تعبیر می گردد.
وقتی کهاین کد را در موضوع کد گذاری خویش اعمال کنیم، خروجی پایین را در مرورگر اخذ خوا هیم کرد.
I am getting called with the value JAVA
I am getting called with the value 10
زمانی می خواهیم نوع generic را به هرکدام از اشکال فوقالعاده آن تخصیص دهیم، بایستی از واژه و کلمه کلیدی out به کار گیری کنیم و وقتی که میخواهیم نوع generic را به هرمورد از اشکال فرعی آن تخصیص دهیم، بایستی از in به کارگیری کنیم.
fun main(args: Array) {
var objet1 = genericsExample(10)
var object2 = genericsExample(10.00)
println(objet1)
println(object2)
}
class genericsExample(input:T) {
init {
println("I am getting called with the value "+input)
}
}
COPY
خروجی :
I am getting called with the value 10
I am getting called with the value 10.0
genericsExample@28d93b30
genericsExample@1b6d3586
Delegation
کاتلین با معرفی یک واژه و کلمه کلیدی نو به عنوان “by” از الگوی پیاده سازی “Delegation” جانبداری می نماید.
با استعمال از این واژه کلیدی یا این که متدولوژی delegation ، کاتلین به کلاس مشتق گردیده اذن میدهد تا از روش یک آبجکت خاص به مجموع متدهای public طراحی گردیده بوسیله یک interface دسترسی پیدا نماید.
نمونه ذیل علامت میدهد که چه گونه این رخداد در کاتلین فیس میدهد.
interface Base {
fun printMe() //abstract method
}
class BaseImpl(val x: Int) : Base {
override fun printMe() { println(x) } //implementation of the method
}
class Derived(b: Base) : Base by b // delegating the public method on the object b
fun main(args: Array) {
val b = BaseImpl(10)
Derived(b).printMe() // prints 10 :: accessing the printMe() method
}
COPY
در نمونه، یک اینترفیس “Base” با مشی abstract آن به اسم “() printme” داریم.
در کلاس BaseImpl، ما این () printme را پیادهسازی میکنیم و بعداً از کلاس دیگری با به کارگیری از واژه کلیدی by از این پیادهسازی استعمال می کنیم.
کد بالا خروجی تحت را در مرورگر خواهد داشت.
10
به کار گیری از () Lazy
Lazy یک تابع lambda میباشد که یک property را تحت عنوان ورودی میگیرد و در عوض آن یک مثال از میدهد، که در آن در اصلً نوع property هایی میباشد که به کارگیری می نماید.
اذن دهید نگاهی به نمونه ذیل بیندازیم تا بفهمیم چه طور فعالیت می نماید.
val myVar: String by lazy {
"Hello"
}
fun main(args: Array) {
println(myVar +" My dear friend")
}
COPY
در کد بالا، یک متغیر myVar را به تابع Lazy می دهیم که در ازای کمی را به آبجکت آن تخصیص می دهد و به عبارتی را به تابع اساسی برمیگرداند.
در پایین خروجی در مرورگر آمده میباشد.
Hello My dear friend
() Delegetion.Observable
() Observable دو آرگومان برای مقداردهی نخستین آبجکت میگیرد و به عبارتی آرگومان را به تابع فراخوانده گردیده برمی گرداند.
در نمونه ذیل، شیوه استعمال از مشی () Observable را برای طراحی Delegetion سپردن خواهیم مشاهده کرد.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("Welcome to manataz.com") {
prop, old, new ->
println("$old -> $new")
}
}
fun main(args: Array) {
val user = User()
user.name = "first"
user.name = "second"
}
COPY
خروجی :
first -> second
به صورت کلی، سینتکس عبارتی میباشد که بعد از واگذاری کلمه و واژه کلیدی by متدهای () get و () set متغیر p به متدهای () getValue و () setValue تعریفوتمجید گردیده در کلاس Delegate ، delegated میگردند.
class Example {
var p: String by Delegate()
}
COPY
برای قطعه کد بالا، کلاس delegate که برای اختصاص مقدار در متغیر p می بایست ساختوساز کنیم، در ذیل آمده میباشد.
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating \'${property.name}\' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to \'${property.name} in $thisRef.\'")
}
}
COPY
در طول قرائت، روال ()getValue فراخوانی می گردد و در هنگام تهیه متغیر روال () setValue فراخوانی میشود.
Extension Properties
Kotlin اذن میدهد تا Extension Properties را به متدی بسیار شبیه مانند extension function طراحی اپلیکیشن در مشهد تمجید کنیم.
Extension properties نیز فارغ کلاس تعریفوتمجید گردیده است.
از آنجایی که extensions در واقع جوارح را در کلاسها وارد نمی کنند، هیچ رویکرد موثری برای داشتن یک فیلد backing به extension property نیست.
به همین استدلال میباشد که initializers برای extension properties مجاز نیستند.
میتوانیم getter و setter را به یاور property هایی که چیزی جز extension functions نیستند اضافه کنیم.
class Temperature(var celsius: Float)
fun main(args: Array) {
val t = Temperature(40f)
println(t.fahrenheit)
t.fahrenheit = 85f
println(t.celsius)
}
var Temperature.fahrenheit: Float
get() = (celsius * 9 / 5) + 32
set(value) {
celsius = (value - 32) * 5 / 9
}
COPY
خروجی :
104.0
29.444445
Data Classes
درین نصیب با کلاس های Data در فراگیری کلاس ها و آبجکت های کاتلین بیشتر آشنا می شویم.
اما ما در قسمت های قبل به کرار از آنها اسم بردیم ، البته درین نصیب معنا آنهارا تحقیق خواهیم کرد.
یک کلاس هر فرصت که تحت عنوان “ Data” نماد گذاری خواهد شد میتواند تحت عنوان یک کلاس داده معرفی گردد.
از این نوع کلاس می اقتدار برای جداگانه نگه داشتن داده های اساسی استفاده نمود.
به غیر از این، هیچ همت دیگری ارائه نمی دهد.
آحاد کلاس های داده می بایست یک primary constructor داشته باشند و کل primary constructor می بایست دستکم یک پارامتر داشته باشند.
هر فرصت که یک کلاس تحت عنوان Data آرم گذاری میگردد، میتوانیم از بعضی از تابع های داخلی آن کلاس داده مانند () toString () ، hashCode و … به کار گیری کنیم.
هر کلاس داده ای نمی تواند modifier مانند abstract و open یا این که internal داشته باشد.
کلاس داده را می شود به کلاس های دیگر نیز پیشرفت بخشید.
در نمونه ذیل یک کلاس داده ساختوساز میکنیم.
fun main(args: Array) {
val book: Book = Book("Kotlin", "manataz.com", 5)
println("Name of the Book is--"+book.name) // "Kotlin"
println("Puclisher Name--"+book.publisher) // "manataz.com"
println("Review of the book is--"+book.reviewScore) // 5
book.reviewScore = 7
println("Printing all the info all together--"+book.toString())
//using inbuilt function of the data class
println("Example of the hashCode function--"+book.hashCode())
}
data class Book(val name: String, val publisher: String, var reviewScore: Int)
COPY
قطعه کد بالا خروجی پایین را در مرورگر ساخت می نماید، جایی که ما یک کلاس داده برای حفظ بعضی از اطلاعات ساخت کرده ایم و از تابع اساسی به تمامی اعضای داده آن دسترسی پیدا کرده ایم.
Name of the Book is--"Kotlin"
Puclisher Name--"manataz.com"
Review of the book is--5
Printing all the info all together--(name-Kotlin, publisher-manataz.com, reviewScore-7)
Example of the hashCode function---1753517245
COPY
Generics
مانند جاوا، Kotlin جايگاه بالاتری از تایپ متغیر به اسم Generics را ارائه میدهد.
درین نصیب ، شیوه پیادهسازی Generics و اینکه به چه شکل تحت عنوان یک بسطدهنده خواهیم توانست از امکانهای ارائه گردیده در کتابخانه ژنریک به کارگیری کنیم، خوا هیم فراگرفت.
از دید پیادهسازی، ژنریکها نسبتاًً مشابه جاوا میباشند، البته گسترش دهنده Kotlin دو کلمه و واژه کلیدی تازه out و in را معرفی نموده است تا کدهای Kotlin را برای گسترش دهنده خواناتر و سهل وآسانخیس نماید.
طبق نمونه، List یک کلاس در Kotlin میباشد، در حالی که List یک نوع در Kotlin میباشد.
نمونه ذیل طریق طراحی ژنریک در کاتلین را نشانه میدهد.
fun main(args: Array) {
val integer: Int = 1
val number: Number = integer
print(number)
}
COPY
در کد بالا یکی درست اعلام کردیم و بعداً آن متغیر را به یک متغیر عددی تخصیص دادیم.
این شغل قابلیت و امکان پذیر میباشد چون Int یک تحت کلاس از کلاس Number میباشد، بدین ترتیب تبدیل به صورت اتومات و ریل تایم رخداد می افتد و خروجی را به طور “1” ایجاد می نماید.
اذن دهید چیزهای بیشتری راجع به ژنریک در Kotlin ارائه دهیم.
خوب میباشد هر مجال که از نوع داده ای که قرار میباشد در نرمافزار استعمال کنیم مطمئن نیستیم به سراغ نوع داده generic برویم.
به صورت کلی، ژنریک با تعریفوتمجید می گردد که در آن T مخفف template میباشد، که میتواند به طور پویا بوسیله کاتلین رقم بخورد.
در نمونه پایین روش استعمال از گونه های داده های generic در گویش نرم افزار نویسی Kotlin را خواهیم مشاهده کرد.
fun main(args: Array) {
var objet = genericsExample("JAVA")
var objet1 = genericsExample(10)
}
class genericsExample(input:T) {
init {
println("I am getting called with the value "+input)
}
}
COPY
در کد بالا، یک کلاس با نوع بازگشتی ساختوساز میکنیم که به طور نمایش داده میشود.
به مشی مهم نگاهی بیندازید، جایی که ما به طور پویا مقدار آن را در انجام با ثابت نوع مقدار تمجید کردهایم، در حالی که آبجکت این کلاس را ساخت و ساز می کنیم.
این میباشد که چهگونه ژنریک بوسیله کامپایلر Kotlin تعبیر می گردد.
وقتی کهاین کد را در موضوع کد گذاری خویش اعمال کنیم، خروجی پایین را در مرورگر اخذ خوا هیم کرد.
I am getting called with the value JAVA
I am getting called with the value 10
زمانی می خواهیم نوع generic را به هرکدام از اشکال فوقالعاده آن تخصیص دهیم، بایستی از واژه و کلمه کلیدی out به کار گیری کنیم و وقتی که میخواهیم نوع generic را به هرمورد از اشکال فرعی آن تخصیص دهیم، بایستی از in به کارگیری کنیم.
fun main(args: Array) {
var objet1 = genericsExample(10)
var object2 = genericsExample(10.00)
println(objet1)
println(object2)
}
class genericsExample(input:T) {
init {
println("I am getting called with the value "+input)
}
}
COPY
خروجی :
I am getting called with the value 10
I am getting called with the value 10.0
genericsExample@28d93b30
genericsExample@1b6d3586
Delegation
کاتلین با معرفی یک واژه و کلمه کلیدی نو به عنوان “by” از الگوی پیاده سازی “Delegation” جانبداری می نماید.
با استعمال از این واژه کلیدی یا این که متدولوژی delegation ، کاتلین به کلاس مشتق گردیده اذن میدهد تا از روش یک آبجکت خاص به مجموع متدهای public طراحی گردیده بوسیله یک interface دسترسی پیدا نماید.
نمونه ذیل علامت میدهد که چه گونه این رخداد در کاتلین فیس میدهد.
interface Base {
fun printMe() //abstract method
}
class BaseImpl(val x: Int) : Base {
override fun printMe() { println(x) } //implementation of the method
}
class Derived(b: Base) : Base by b // delegating the public method on the object b
fun main(args: Array) {
val b = BaseImpl(10)
Derived(b).printMe() // prints 10 :: accessing the printMe() method
}
COPY
در نمونه، یک اینترفیس “Base” با مشی abstract آن به اسم “() printme” داریم.
در کلاس BaseImpl، ما این () printme را پیادهسازی میکنیم و بعداً از کلاس دیگری با به کارگیری از واژه کلیدی by از این پیادهسازی استعمال می کنیم.
کد بالا خروجی تحت را در مرورگر خواهد داشت.
10
به کار گیری از () Lazy
Lazy یک تابع lambda میباشد که یک property را تحت عنوان ورودی میگیرد و در عوض آن یک مثال از میدهد، که در آن در اصلً نوع property هایی میباشد که به کارگیری می نماید.
اذن دهید نگاهی به نمونه ذیل بیندازیم تا بفهمیم چه طور فعالیت می نماید.
val myVar: String by lazy {
"Hello"
}
fun main(args: Array) {
println(myVar +" My dear friend")
}
COPY
در کد بالا، یک متغیر myVar را به تابع Lazy می دهیم که در ازای کمی را به آبجکت آن تخصیص می دهد و به عبارتی را به تابع اساسی برمیگرداند.
در پایین خروجی در مرورگر آمده میباشد.
Hello My dear friend
() Delegetion.Observable
() Observable دو آرگومان برای مقداردهی نخستین آبجکت میگیرد و به عبارتی آرگومان را به تابع فراخوانده گردیده برمی گرداند.
در نمونه ذیل، شیوه استعمال از مشی () Observable را برای طراحی Delegetion سپردن خواهیم مشاهده کرد.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("Welcome to manataz.com") {
prop, old, new ->
println("$old -> $new")
}
}
fun main(args: Array) {
val user = User()
user.name = "first"
user.name = "second"
}
COPY
خروجی :
first -> second
به صورت کلی، سینتکس عبارتی میباشد که بعد از واگذاری کلمه و واژه کلیدی by متدهای () get و () set متغیر p به متدهای () getValue و () setValue تعریفوتمجید گردیده در کلاس Delegate ، delegated میگردند.
class Example {
var p: String by Delegate()
}
COPY
برای قطعه کد بالا، کلاس delegate که برای اختصاص مقدار در متغیر p می بایست ساختوساز کنیم، در ذیل آمده میباشد.
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating \'${property.name}\' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to \'${property.name} in $thisRef.\'")
}
}
COPY
در طول قرائت، روال ()getValue فراخوانی می گردد و در هنگام تهیه متغیر روال () setValue فراخوانی میشود.

معایب سبک ایده پردازی و فروش آن و درآمد از اندروید