[go: up one dir, main page]

0% found this document useful (0 votes)
661 views168 pages

دليل مختصر للغة Kotlin

This document provides an introduction and overview of the Kotlin programming language. It discusses Kotlin's variables, data types, operations, strings, arrays, scopes, comments, control flows and more. The document is a reference for learning Kotlin syntax and fundamentals. It explains concepts in both Arabic and English through examples and explanations.

Uploaded by

kamel
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
661 views168 pages

دليل مختصر للغة Kotlin

This document provides an introduction and overview of the Kotlin programming language. It discusses Kotlin's variables, data types, operations, strings, arrays, scopes, comments, control flows and more. The document is a reference for learning Kotlin syntax and fundamentals. It explains concepts in both Arabic and English through examples and explanations.

Uploaded by

kamel
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 168

‫ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬

‫‪Kotlin‬‬

‫أﺣﻤﺪ اﻟﺠﻌﻴﺪ‬
‫اﻟﻤﺤﺘﻮﻳﺎت‬

‫اﻟﻤﺤﺘﻮﻳﺎت ‪2 .....................................................................................................................................................‬‬

‫ﺑﻴﺌﺔ اﻟﻌﻤﻞ ‪ERROR! BOOKMARK NOT DEFINED. ...........................................‬‬

‫ﺗﺜﺒﻴﺖ ‪9 ........................................................................................................................................... JAVA 8‬‬


‫ﺗﺜﺒﻴﺖ‪9 ...................................................................................................................................................... IDE‬‬
‫اﺳﺘﺨﺪام‪10 ..................................................................................................................................... vs code‬‬
‫ﻣﻮﺟﻪ اﻷواﻣﺮ ‪13 ...............................................................................................................................................‬‬
‫ﺗﮭﯿﺌﺔ ‪ ECLIPSE‬ﻟﺒﺮﻣﺠﺔ ‪14 ............................................................................ KOTLIN‬‬
‫ﺗﺜﺒﻴﺖ اﻻدوات ‪14 ............................................................................................................................................‬‬
‫ﻣﺸﺮوع‪16 .......................................................................................................................................... Kotlin‬‬
‫اﻫﻼ ً ﺑﺎﻟﻌﺎﻟﻢ ‪17 ..................................................................................................................................................‬‬
‫ﻟﻐﺔ ‪18 ..................................................................................................... KOTLIN‬‬
‫أوﻻ ‪ :‬ﻣﻘﺪﻣﺔ ‪18 .................................................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﺟﺎﻓﺎ ‪ Java‬أم ﻛﻮﺗﻠﻦ‪18 .......................................................................................................... Kotlin‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺰا ﻳﺎ ﻟﻐﺔ ﻛﻮﺗﻠﻦ‪19 ................................................................................................................. Kotlin‬‬

‫اﻟﻤﻘﺪﻣﺔ‪20 .....................................................................................................................‬‬
‫اﻟﻤﺘﻐﯿﺮات ‪21 ........................................................................................................‬‬
‫أوﻻ ‪ :‬ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮات‪21 ............................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬أﻧﻮاع اﻟﻤﺘﻐﻴﺮات ‪23 ..............................................................................................................................‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﺗﺤﻮﻳﻞ اﻟﻤﺘﻐﻴﺮات ‪24 ...........................................................................................................................‬‬
‫راﺑﻌﺎ ً ‪ :‬ﺑﺮﻧﺎﻣﺞ "‪25 ................................................................................................................. "hello world‬‬
‫ادﺧﺎل اﻟﺒﯿﺎﻧﺎت ‪26 ...................................................................................................‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪2‬‬


‫أوﻻ ‪ :‬داﻟﺔ ‪27 .................................................................................................................................. readLine‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﺘﺤﻮﻳﻞ‪27 .............................................................................................................................................‬‬
‫اﻟﺘﻌﻠﯿﻘﺎت ‪29 .........................................................................................................‬‬
‫اﻟﻌﻤﻠﯿﺎت اﻟﺮﯾﺎﺿﯿﺔ ‪31 ..............................................................................................‬‬
‫أوﻻ ‪ :‬اﻟﺮﻣﻮز اﻟﺮﻳﺎﺿﻴﺔ ‪31 .................................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪32 ........................................................................................................ Decrement & Increment :‬‬
‫اﻟﻌﻤﻠﯿﺎت اﻟﻤﻨﻄﻘﯿﺔ ‪33 ..............................................................................................‬‬
‫أوﻻ ‪ :‬اﻟﺮﻣﻮز اﻟﻤﻨﻄﻘﻴﺔ ‪34 ................................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﺒﻮاﺑﺎت اﻟﻤﻨﻄﻘﻴﺔ "اﻟﻤﻘﺎرﻧﺔ" ‪35 .......................................................................................................‬‬
‫اﻟﺴﻼﺳﻞ اﻟﻨﺼﯿﺔ ‪38 ................................................................................................‬‬
‫اﻟﻤﺼﻔﻮﻓﺎت ‪42 ......................................................................................................‬‬
‫أوﻻ ‪ :‬ﺗﻌﺮﻳﻒ اﻟﻤﺼﻔﻮﻓﺔ ‪42 ............................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬إدﺧﺎل ﻗﻴﻢ ﻟﻠﻤﺼﻔﻮﻓﺔ ‪43 ...................................................................................................................‬‬
‫ﺛﺎﻟﺜﺎ ‪ :‬ﻃﺒﺎﻋﺔ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ ‪45 ...............................................................................................................‬‬
‫راﺑﻌﺎ ‪ :‬اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺼﻔﻮﻓﺎت ‪47 .............................................................................................................‬‬
‫اﻟﻨﻄﺎق ‪49 ............................................................................................................‬‬
‫أوﻻ ‪ :‬اﻟﻨﻄﺎق‪49 .................................................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﻘﻔﺰة أو ‪51 ................................................................................................................................. step‬‬
‫ﺛﺎﻟﺜﺎ ‪ :‬اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻨﻄﺎق ‪51 ........................................................................................................................‬‬
‫‪54 ...................................................................................... VISIBILITY MODIFIERS‬‬
‫أوﻻ ‪ :‬رؤﻳﺔ اﻟﻤﺘﻐﻴﺮات‪54 .................................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬أﻫﻤﻴﺔ رؤﻳﺔ اﻟﻤﺘﻐﻴﺮات ‪55 ...................................................................................................................‬‬
‫‪55 ..................................................................................... ESCAPE SEQUENCE‬‬
‫أوﻻ ‪ :‬ﻣﺎﻫﻲ اﻻﺧﺘﺼﺎرات أو اﻷواﻣﺮ اﻟﺴﺮﻳﻌﺔ ‪55 ........................................... ESCAPE SEQUENCE‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﺮﻣﻮز وﻣﻌﺎﻧﻴﻬﺎ ‪55 ...............................................................................................................................‬‬
‫‪58 ..................................................................................................... UNICODE‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪3‬‬


‫)‪62 ....................................................................... REGEX (REGULAR EXPRESSION‬‬
‫أوﻻ ‪ :‬اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳﻴﺔ‪62 ..........................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬ﻃﺮﻳﻘﺔ اﻟﺘﻌﺒﻴﺮ ﻋﻦ اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳﻴﺔ ‪63 ......................................................................................‬‬
‫ﺛﺎﻟﺜﺎ‪ :‬ﻣﺜﺎل‪66 ................................................................................................................................................. :‬‬
‫راﺑﻌﺎ ‪ :‬اﻟﺪوال اﻟﻤﺴﺘﺨﺪﻣﺔ ﻣﻊ اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳﻴﺔ ‪68 ...........................................................................‬‬

‫ﺑﻨﻰ اﻟﺘﺤﻜﻢ ‪74 ..............................................................................................................‬‬


‫‪74 ...................................................................................................... FOR LOOP‬‬
‫أوﻻ ‪ :‬اﻟﺠﻤﻠﺔ ‪74 ............................................................................................................................... for loop‬‬
‫ﺛﺎﻧﻴﺎ ‪ nested for :‬واﻟﻤﻘﺼﻮد ﻫﻨﺎ اﻟﺤﻠﻘﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪76 .....................................................................‬‬
‫‪78 ......................................................................................... WHILE & DO WHILE‬‬
‫اﻟﺠﻤﻠﺔ‪78 ............................................................................................................................................... while‬‬
‫‪79 ............................................................................................................................................nested while‬‬
‫اﻟﺠﻤﻠﺔ‪79 ...................................................................................................................................... do…while‬‬
‫‪81 ............................................................................................................WHEN‬‬
‫اﻟﺠﻤﻠﺔ اﻟﺸﺮطﯿﺔ‪84 .................................................................................................‬‬
‫اﻟﺠﻤﻠﺔ‪84 ....................................................................................................................................................... if‬‬
‫‪85 ........................................................................................................................................................ if ..else‬‬
‫‪86 .................................................................................................................................................... if ..else if‬‬
‫‪ If‬اﻟﻤﺘﺪاﺧﻠﺔ ‪87 ...............................................................................................................................................‬‬
‫اﻟﺘﻌﺒﻴﺮات ﻣﻊ ‪88 ........................................................................................................................................ if‬‬

‫اﻟﺪوال ‪90 .......................................................................................................................‬‬


‫اﻟﺪوال ‪90 .............................................................................................................‬‬
‫أوﻻ ‪ :‬ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺘﻬﺎ ‪90 ....................................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬أﻧﻮاع اﻟﺪوال ‪90 ......................................................................................................................................‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪4‬‬


‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻻﺳﺘﺪﻋﺎء‪92 ..........................................................................................................................................‬‬
‫‪94 ..................................................................................... EXTENSION FUNCTION‬‬
‫‪96 ......................................................................................... LAMBDA FUNCTION‬‬
‫‪98 ..................................................................................... HIGH LEVEL FUNCTION‬‬
‫ﻣﻔﮭﻮم ‪100 ................................................................................. JUMP & RETURN‬‬

‫ﺑﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ‪101 ..............................................................................................‬‬

‫أوﻻ ‪ :‬اﻟﺒﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ‪102 ...................................................................................................................‬‬


‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻣﻘﺪﻣﺔ ﻋﻦ‪102 ............................................................................................... Classes & Object‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﻔﺮق ﺑﻴﻦ‪103 ................................................................................................. Classes & Object‬‬
‫‪104 .............................................................................................. CLASSES OOP‬‬
‫أوﻻ ً ‪ :‬ﻃﺮﻳﻘﺔ إﻧﺸﺎء اﻟﺼﻨﻒ‪104 ......................................................................................................... class‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻃﺮﻳﻘﺔ إﻧﺸﺎء ﻛﺎﺋﻦ‪106 ........................................................................................................ Object‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﻮﺻﻮل إﻟﻰ اﻟﻤﺘﻐﻴﺮات اﻟﺨﺎﺻﺔ ﺑﺎﻟـ ‪106 ..............................................................................Class‬‬
‫راﺑﻌﺎ ً ‪ :‬اﻟﻮﺻﻮل إﻟﻰ اﻟﺪوال اﻟﺨﺎﺻﺔ ﺑﺎﻟـ ‪108 .................................................................................... Class‬‬
‫ﺧﺎﻣﺴﺎ ً ‪ :‬ﺗﻤﺮﻳﺮ اﻟﻮﺳﺎﺋﻂ ﻓﻲ‪108 ....................................................................................................... Class‬‬
‫ﺳﺎدﺳﺎ ً ‪ :‬ﻛﻠﻤﺔ‪110 ................................................................................................................................ this‬‬
‫ﺳﺎﺑﻌﺎ ً ‪ :‬داﻟﺔ اﻟﺒﻨﺎء ‪111 .........................................................................................................constructor‬‬
‫ﺗﻨﻮﻳﻪ ‪113 ..........................................................................................................................................................‬‬
‫‪114 ................................................................................................ INHERITANCE‬‬
‫أوﻻ ‪ :‬ﻣﻔﺎﻫﻴﻢ ﻣﺘﻌﻠﻘﺔ ﺑﺎﻟﻮراﺛﺔ ‪115 ...............................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﻟﻮراﺛﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ‪116 ........................................................................................................................‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻮﺳﺎﺋﻂ اﻟﻤﻤﺮرة ﻟﻠﺘﺼﻨﻴﻒ ‪118 ................................................................................‬‬
‫راﺑﻌﺎ ‪ :‬اﻟﻔﺮق ﺑﻴﻦ ‪ this‬و‪121 .......................................................................................................... super‬‬
‫‪121 ................................................................................................... INTERFACE‬‬
‫أوﻻ ً ‪ :‬ﺗﻤﻬﻴﺪ ‪121 ...............................................................................................................................................‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪5‬‬


‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﻟﺘﻌﺮﻳﻒ ﻋﻦ‪122 ............................................................................................................. interface‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻹﻋﻼن ﻓﻲ ‪122 ................................................................................................................. interface‬‬
‫راﺑﻌﺎ ً ‪ :‬اﺳﺘﺨﺪام‪123 ................................................................................................................... interface‬‬
‫ﺧﺎﻣﺴﺎ ً ‪ :‬ﻣﺜﺎل‪127 .................................................................................................................... interface‬‬
‫‪129 .................................................................................................... ABSTRACT‬‬
‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم اﻟـ‪129 ....................................................................................................................... abstract‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﺳﺘﺨﺪام اﻟـ‪129 ................................................................................................................. abstract‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻧﺸﺎء ﺗﺼﻨﻴﻒ‪129 ........................................................................................................... abstract‬‬
‫راﺑﻌﺎ ً ‪ :‬ﻣﺜﺎل ‪130 ..............................................................................................................................................‬‬
‫ﺧﺎﻣﺴﺎ ً ‪ :‬ﻣﺒﺪأ اﻟﻮراﺛﺔ اﻟﻤﺘﻌﺪدة ‪133 ..................................................................... multi inheritance‬‬
‫‪134 .................................................................................................... OVERRIDE‬‬
‫أوﻻً ‪ :‬ﻣﻔﮭوم‪134 ............................................................................................................................ Override‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻛﻠﻤﺔ‪136 ...................................................................................................................................... final‬‬
‫‪137 ...................................................................................................OVERLOAD‬‬
‫‪139 ..................................................................................... COMPANION OBJECT‬‬
‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم‪139 ....................................................................................................... companion object‬‬
‫ﺛﺎﻧﻴﺎ ِ ‪ :‬ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺘﻪ ‪139 .................................................................................................................................‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺜﺎل ‪139 ...............................................................................................................................................‬‬
‫راﺑﻌﺎ ً ‪ :‬ﻣﺘﻐﻴﺮ ﻳﺴﺘﻘﺒﻞ‪141 .................................................................................... companion object‬‬
‫ﺧﺎﻣﺴﺎ ً ‪ :‬ﻣﻌﻠﻮﻣﺎت ﺣﻮل‪143 ................................................................................ companion object‬‬
‫اﻟﺘﺼﻨﯿﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪145 ................................................................ NASTED CLASSES‬‬
‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪145 ......................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻃﺮﻳﻘﺔ ﺗﻌﺮﻳﻒ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪145 ......................................................................................‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬أﻫﻤﻴﺔ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪146 .....................................................................................................‬‬
‫راﺑﻌﺎ ً ‪ :‬ﻣﺼﻄﻠﺤﺎت ﻣﻬﻤﺔ ﻓﻲ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪146 .........................................................................‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪6‬‬


‫ﺧﺎﻣﺴﺎ ً ‪ :‬اﻧﺸﺎء ﻛﺎﺋﻦ ﻣﻦ‪146 ................................................................................................ inner class‬‬
‫ﺳﺎدﺳﺎ ً ‪ :‬ﻣﺜﺎل‪147 ..........................................................................................................................................‬‬
‫‪148 ............................................................................................... ENUM CLASS‬‬
‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم‪148 ..................................................................................................................... Enum class‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﺳﺘﺨﺪاﻣﻬﺎ‪148 ........................................................................................................... Enum class‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﺗﻌﺮﻳﻒ‪148 .................................................................................................................. Enum class‬‬
‫‪149 .................................................................................................. DATA CLASS‬‬
‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم‪149 ........................................................................................................................ data class‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻃﺮﻳﻘﺔ‪150 ...................................................................................................................... data class‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺜﺎل ﻻﺳﺘﺨﺪام‪150 ................................................................................................................. class‬‬
‫راﺑﻌﺎ ً ‪ :‬اﺿﺎﻓﺔ ‪ data‬ﻗﺒﻞ ﺗﻌﺮﻳﻒ‪151 ............................................................................................... class‬‬
‫‪152 ........................................................................................... POLYMORPHISM‬‬
‫أوﻻ ً ‪ :‬ﻣﺒﺪأ‪152 .................................................................................................................. Polymorphism‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﺷﺮوط‪152 ............................................................................................................ Polymorphism‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬أﻣﺜﻠﺔ ﻣﺘﻨﻮﻋﺔ ﻟﻤﻔﻬﻮم‪153 ...................................................................................Polymorphism‬‬
‫اﻻﺳﺘﺜﻨﺎءات ‪159 ................................................................................. EXCEPTION-‬‬
‫أوﻻ ‪ :‬ﻣﺎ ﻫﻲ اﻻﺳﺘﺜﻨﺎءات ‪159 .......................................................................................................................‬‬
‫ﺛﺎﻧﻴﺎ ‪ :‬ﺗﻜﻮﻳﻦ اﻻﺳﺘﺜﻨﺎءات‪159 ......................................................................................................................‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺜﺎل ‪161 ...............................................................................................................................................‬‬
‫‪161 ....................................................................................... MULTI-THREADING‬‬
‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم ‪161 ................................................................................................................ multi-thread‬‬
‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻋﻤﻞ‪162 .................................................................................................................... multi-thread‬‬
‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﺪوال اﻟﺘﻲ ﺗﻌﻤﻞ ﻣﻊ‪164 ................................................................................................. thread‬‬
‫‪167 ............................................................................................................ ANY‬‬
‫أوﻻ ً ‪ :‬ﻣﺎ ﻫﻮ ‪167 ........................................................................................................................... class any‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪7‬‬


‫ﺗﻘﺪﻳﻢ‬

‫ﻟﻐﺔ ‪ Kotlin‬اﺣﺪى اﻟﻠﻐﺎت اﻟﺘﻲ ﻻﻗﺖ رواﺟﺎ ً ﻓﻲ اﻟﺴـﻨﺘﻴﻦ اﻟﻤﺎﺿـﻴﺔ وزادت ﺷـﻌﺒﻴﺘﻬﺎ ﺑﻌﺪ دﻋﻤﻬﺎ اﻻﻧﺪروﻳﺪ‬
‫ﺑﺸﻜﻞ رﺳﻤﻲ ﻓﻲ اﻧﺪروﻳﺪ اﺳﺘﺪﻳﻮ ﻟﺒﺮﻣﺠﺔ ﺗﻄﺒﻴﻘﺎت اﻻﻧﺪروﻳﺪ ‪..‬‬

‫ﻟﻐﺔ ‪ Kotlin‬ﻗﺎدرة ﻋﻠﻰ ﺑﺮﻣﺠﺔ ﺗﻄﺒﻴﻘﺎت اﻟﻮﻳﺐ واﻟ ـ ــــــــــ ـ‪ IOS‬ﺑﺸـ ــ ـﻜﻞ ﻃﺒﻴﻌﻲ ﺑﺎﺳـ ــ ـﺘﺨﺪام أدوات‬
‫ﻟﻠﺘﻄﻮﻳﺮ ﻣﺪﻋﻮﻣﺔ ﻣﺒﺎﺷﺮة ﻣﻦ اﻟﺸﺮﻛﺔ اﻟﻤﻄﻮرة ﻟـ‪Kotlin‬‬

‫ﻜﺘﻴـﺐ ا ﻳﺠـﺎز ﻟﻐـﺔ ‪ Kotlin‬ﺑﺸـ ــــــ ـﻜـﻞ ﻋـﺎم ﻟﻴﺘﻤﻜﻦ اﻟﻤﺴـ ــــــ ـﺘﺨـﺪم اﻟﻤﺒﺘـﺪئ ﻓﻲ‬
‫ﺣـﺎوﻟـﺖ ﻓﻲ ﻫـﺬا اﻟ ُ‬
‫اﻟﺒﺮﻣﺠﺔ ﻣﻦ ﻣﻌﺮﻓﺔ ﺟﻤﻴﻊ ﺟﻮاﻧﺐ اﻟﻠﻐﺔ‪.‬‬

‫وﻓﻲ اﻟﻨﻬـﺎﻳـﺔ اﺣﻤـﺪ ﷲ ﻋﻠﻰ اﻧﻬـﺎء ﻫـﺬا اﻟﻌﻤـﻞ وارﺟﻮا ان ﻳﻜﻮن ﻧـﺎﻓﻌـﺎ ً ﻻﺛﺮاء اﻟﻤﺤﺘﻮى اﻟﻌﺮﺑﻲ ﻓﻲ‬
‫ﻣﺠﺎل اﻟﺒﺮﻣﺠﺔ‪.‬‬

‫اﺣﻤﺪ اﻟﺠﻌﻴﺪ‬
‫ﻣﻌﻠﻢ ﺣﺎﺳﺐ آﻟﻲ – وزارة اﻟﺘﺮ ﺑﻴﺔ واﻟﺘﻌﻠﻴﻢ‬
‫ا ﻟﺴﻌﻮدﻳﺔ‬
‫ﺗﻮاﺻﻞ‪aljo3aid@gmail.com :‬‬
‫‪966504511433.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪8‬‬


‫ﺑﻴﺌﺔ اﻟﻌﻤﻞ‬
‫ﻟﻠﺒـﺪء ﻓﻲ اﻟـﺪروس ﻧﺤﺘـﺎج اﻟﻰ ﺗﻬﻴﺌـﺔ ﺑﻴﺌـﺔ ﺗﺸـ ــــــ ـﻐﻴـﻞ ﻟﻠﻌﻤـﻞ ﻋﻠﻲ اﻟﺒﺮﻣﺠـﺔ و ‪Compiler‬‬
‫ﻟﻠﻐﺔ ‪ .Kotlin‬ﻧﺤﺘﺎج ﻟﻠﻘﻴﺎم ﺑﺒﻌﺾ اﻟﺨﻄﻮات ﻟﻨﺠﻌﻞ ﺟﻬﺎزك ﺟﺎﻫﺰ ﻟﻠﺒﺮﻣﺠﺔ‪.‬‬

‫ﺗﺜﺒﻴﺖ ‪JAVA 8‬‬

‫‪ Kotlin‬ﺗﻌﻤﻞ ﻋﻠﻰ ‪ JVM‬وﻟﻬﺬا اﻟﺴـ ــــ ـﺒﺐ ﻧﺤﺘﺎج اﻟﻰ ﺗﺜﺒﻴﺖ ‪ JDK 8‬ﻋﻠﻰ ﺟﻬﺎزك‪ .‬اذﻫﺐ‬
‫اﻟﻰ اﻟﻤﻮﻗﻊ اﻟﺮﺳ ـﻤﻲ ﻟ ـ ــــــــ ـﺎورا ﻛﻞ وﻗﻢ ﺑﺘﺤﻤﻴﻞ وﺗﺜﺒﻴﺖ ‪ JDK 8‬او اﺣﺪث‪ .‬اذا ﻛﻨﺖ ﻗﺪ ﺟﻬﺰت‬
‫ﺑﻴﺌﺔ ﻟﺒﺮﻣﺠﺔ ‪ JAVA‬ﻓﺒﻄﺒﻴﻌﺔ اﻟﺤﺎل ﻻ ﺗﺤﺘﺎج اﻟﻰ ﺗﺜﺒﻴﺖ ‪ JDK‬وﻟﻜﻦ ﻳﺠﺐ ان ﺗﺘﺎﻛﺪ ﻣﻦ رﻗﻢ‬
‫اﻻﺻـ ـــ ـﺪار ﻟﺪﻳﻚ ﺑﺎﺳـ ـــ ـﺘﺨﺪام اﻻﻣﺮ ‪ java -version‬ﻓﻲ ﻣﻮﺟﺔ اﻻواﻣﺮ ﻟﻠﻮﻧﺪوز او اﻟﻄﺮﻓﻴﺔ ﻟﻼﺟﻬﺰ‬
‫ﻳﻮﻧﻜﺲ وﻣﺎك‪.‬‬

‫ﺗﺜﺒﻴﺖ ‪IDE‬‬

‫ﻳﻮﺟﺪ اﻟﻜﺜﻴﺮ ﻣﻦ ﺑﺮاﻣﺞ ‪ IDE‬ﻋﻠﻲ ﺷـ ـﺒﻜﺔ اﻻﻧﺘﺮﻧﺖ وﻟﻜﻦ اﻟﺸـ ـﻬﻴﺮ ﻣﻨﻬﺎ ر ﺑﻤﺎ ﻳﻜﻮن ﻣﻌﺪود‬
‫ﻋﻠﻰ اﻻﺻﺎﺑﻊ ﻟﺬﻟﻚ ﺳﺄ ﻛﺘﺐ ﻟﻚ اﻻﺷﻬﺮ ﻣﻨﻬﺎ وﺗﺴﺘﻄﻴﻊ اﺧﺘﻴﺎر ﻣﺎﻳﻨﺎﺳﺒﻚ واﺳﺘﺨﺪاﻣﺔ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪9‬‬


‫اﺳﺘﺨﺪام ‪vs code‬‬

‫ﺣﻘﻴﻘﺔ ﻓﻲ اﻟﺒﺪا ﻳﺎت اﻧﺼ ـﺢ ﺑﺎﺳ ـﺘﺨﺪام ﻣﺤﺮرات ﺷ ـﻔﺮات ﺑﺴ ـﻴﻄﺔ ﻻﺗﺪﻋﻢ اﻻﻛﻤﺎل اﻟﺘﻠﻘﺎﺋﻲ‬
‫ﻟﻴﺲ ﻟﻠﻨﻌﻘﻴـﺪ وﻟﻜﻦ ﻟﺠﻌـﻞ ﻳـﺪك ﻣﻤـﺎرﺳـ ــــــ ـﻪ ﻟﻠﻜﺘـﺎﺑـﺔ اﻟﺴـ ــــــ ـﺮ ﻳﻌـﺔ وا ﻳﻀـ ــــــ ـﺎ ً ﻟﻠﻔﻬﻢ اﻟﺠﻴـﺪ دون‬
‫اﺳﺘﺨﺪام ﺑﺮاﻣﺞ اﻻﻛﻤﺎل اﻟﺘﻠﻘﺎﺋﻲ‪.‬‬

‫ﻣﻦ اﻓﻀـ ـﻞ ﻣﺤﺮرات اﻻﻛﻮاد اﻟﺘﻲ اﺳـ ـﺘﺨﺪﻣﺘﻬﺎ ﻣﺆﺧﺮا ً وﻫﻮ ‪ vs code‬ﻣﺤﺮر ﺑﺴـ ـﻴﻂ وﻟﻜﻦ‬
‫ﻛﻤﻴـﺔ اﻻﺿـ ـــــــ ـﺎﻓـﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﻤﺘﺠﺮ اﻟﺨـﺎص ﻓﻴـﻪ ﺗﺠﻌـﻞ ﻣﻨـﻪ ﻣﻨـﺎﻓﺲ ﺷـ ــــــ ـﺮس ﻟﻠﺒﺮاﻣﺞ‬
‫اﻟﻜﺒﻴﺮة واﻟﻤﺘﺨﺼﺼﻪ‪.‬‬

‫‪ v‬ﺗﺤﻤﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ‬

‫‪ v‬اﺿﺎﻓﺔ ‪Kotlin‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪10‬‬


‫اﺿـ ـﺎﻓﺔ ﺗﻘﻮم ﺑﺪﻋﻢ ‪ Syntax highlighter‬ﻓﻲ ﻟﻐﺔ ‪ kotlin‬ﺣﺼـ ـﻠﺖ اﻻﺿـ ـﺎﻓﺔ ﻋﻠﻰ ‪ 30‬اﻟﻒ‬
‫ﺗﺤﻤﻴﻞ ﺗﻘﺮ ﻳﺒﺎ ً وﻣﺪﻋﻮﻣﺔ ﺑﺸ ـﻜﻞ ﻛﺒﻴﺮ ﻣﻦ اﻟﻤﻄﻮر ﻋﻠﻰ ﺻ ـﻔﺤﺔ ‪ github‬اﻟﺨﺎﺻ ـﺔ ﺣﻴﺚ ﺗﺘﻴﺢ‬
‫ﻟﻚ ﺗﺸﻐﻴﻞ اﻟﺸﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣﻦ اي ﺻﻔﺤﺔ ﻣﻔﺘﻮﺣﺔ ﻣﺒﺎﺷﺮة‪.‬‬

‫اﻻﺿـ ـــ ـﺎﻓﺔ ﺑﺪورﻫﺎ ﺳـ ـــ ـﺘﻘﻮم ﺑﺘﺤﺪﻳﺪ اﻟﻤﺘﻐﻴﺮات ﺑﺎﻟﻮان ﻣﺨﺘﻠﻔﺔ وﺗﺮﺗﻴﺐ اﻟﺸـ ـــ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ‬
‫ﺑﺸﻜﻞ ﺟﺬاب وﺟﻤﻴﻞ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪11‬‬


‫‪ v‬إﺿ ﺎﻓ ﺔ ﺳ ﻤ ﺔ ﻟﻴﻠﻴﺔ‬

‫ﻣــﺎﻳﻬﻢ اﻟﻤﺒﺮﻣﺠﻴﻦ ان ﻳﻜﻮن اﻟﻤﺤﺮر ﻣﺮ ﻳﺢ ﻟﻠﻌﻴﻦ ﻓﻨﻌﻠﻢ ﺟﻤﻴﻌـ ـﺎ ً اﻋﺘﻜـ ـﺎﻓﻨـ ـﺎ ﻋﻠﻰ اﺟﻬﺰة‬
‫اﻟﺤﺴـﺎب ﻻوﻗﺎت ﻃﻮ ﻳﻠﺔ وﻟﻜﻦ ﻫﺬا اﻟﺸـﻲ ﻣﺘﻌﺐ ﻟﻠﻌﻴﻦ ﻓﻲ ﺣﺎﻟﺔ ﻛﺎﻧﺖ اﻟﺸـﺎﺷـﺔ ﺗﺸـﻊ ﺑﺎﻟﻠﻮن‬
‫اﻻﺑﻴﺾ وﻟﺬﻟﻚ ﺳـ ـﻨﺤﺘﺎج اﻟﻰ اﺿـ ـﺎﻓﺔ ﺳـ ـﻤﺎت ﻟﻴﻠﻴﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ وﺳـ ـﺎﻗﻮم ﺑﺎﺿـ ـﺎﻓﺔ اﻟﺴـ ـﻤﺔ اﻟﺘﻲ‬
‫اﺳﺘﺨﺪﻣﻬﺎ ‪ .‬اﺳﻢ اﻟﺴﻤﺔ‪Atom One Dark Theme .‬‬

‫‪ v‬اﺿﺎﻓﺔ ا ﻳﻘﻮﻧﺎت ﺗﻮﺿﻴﺤﻴﺔ‬

‫ﻧﻌﻠﻢ ﺟﻤﻴﻌﺎ ً ان اي ﻟﻐﺔ ﺑﺮﻣﺠﺔ ﻳﻜﻮن ﻟﻬﺎ ا ﻳﻘﻮﻧﺔ ﺗﻮﺿــﻴﺤﻴﺔ وﺳــﻨﻘﻮم ﺑﺎﺿــﺎﻓﺘﻬﺎ ﻟﻠﺒﺮﻧﺎﻣﺞ‬
‫وذﻟﻚ ﻻﻋﻄﺎء اﻟﺒﺮﻧﺎﻣﺞ ﺷـ ــ ـﻜﻞ ﺟﻤﻴﻞ وﻣﺮﺗﺐ ‪ .‬اﻻﺿـ ــ ـﺎﻓﺔ ﺗﺨﻄﺖ اﻟﻤﻠﻴﻮن ﺗﺤﻤﻴﻞ ﻟﺸـ ــ ـﻌﺒﻴﺘﻬﺎ‬
‫وﺟﺬاﺑﻴﺘﻬﺎ ودﻋﻤﻬﺎ اﻟﻤﺴﺘﻤﺮ ﻣﻦ اﻟﻤﺒﺮﻣﺞ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪12‬‬


‫ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﺷﻜﺎل اﻻﻳﻘﻮﻧﺎت اﻟﺨﺎﺻﺔ ﺑﻠﻐﺎت اﻟﺒﺮﻣﺠﺔ‬

‫اﻵن اﺻﺒﺢ ﻟﺪﻳﻚ ﻣﺤﺮر أ ﻛﻮاد ﻗﻮي وﻣﻨﺎﻓﺲ ﻛﺒﻴﺮ‪.‬‬

‫ﻣﻮﺟﻪ اﻷواﻣﺮ‬

‫ـــــــــــ ـ ‪Kotlin‬‬ ‫اﻻن ﻧﺤﺘﺎج ﻟﺘﺤﻤﻴﻞ اﺿـ ـــ ـﺎﻓﺎت ﻟﻠﻨﻈﺎم ﻟﻌﻤﻞ ‪ compiler‬ﻟﻠﺸـ ـــ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻟ ـ‬
‫ﺑﺎﺳﺘﺨﺪام ﻣﻮﺟﻪ اﻻواﻣﺮ ﻻن اﻻﺿﺎﻓﺔ ﺗﻌﺘﻤﺪ ﻋﻠﻴﻪ ﺑﺸﻜﻞ اﺳﺎﺳﻲ‪.‬‬

‫ﻗﻢ ﺑﺘﺤﻤﻴﻞ اﺧﺮ اﺻﺪار ﻣﻦ ﻫﻨﺎ وﺳﻴﻘﻮم ﺑﺎﻟﺘﺜﺒﻴﺖ ﺑﺸﻜﻞ ﺗﻠﻘﺎﺋﻲ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪13‬‬


‫اﻻن ﻳﻤﻜﻨﻚ اﻻﻧﺘﻘﺎل ﻟﻠﺪروس وﻣﺘﺎﺑﻌﺘﻬﺎ‬

‫ﺗﻬﻴﺌﺔ ‪ Eclipse‬ﻟﺒﺮﻣﺠﺔ ‪Kotlin‬‬

‫ﻳﻌﺘﺒﺮ ‪ Eclipse‬ﻣﻦ أﻗﻮى ‪ IDE‬اﻟﻤﺠﺎﻧﻴﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﻻﺣﺘﻮاﺋﻪ ﻋﻠﻲ ﻣﺘﺠﺮ وإﺿـ ـــ ـﺎﻓﺎت ﻛﺜﻴﺮة‬
‫ﺗﺪﻋﻢ اﻟﻌﺪﻳﺪ ﻣﻦ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ واﻟﺪﻋﻢ اﻟﻜﺒﻴﺮ ﻣﻦ اﻟﻤﻄﻮر ﻳﻦ‪.‬‬

‫ﻧﺤﺘﺎج اﺿﺎﻓﺔ ﺑﻌﺾ اﻻدوات ﻟﻠﺒﺮﻧﺎﻣﺞ ﺣﺘﻰ ﻧﺴﺘﻄﻴﻊ اﺳﺘﺨﺪاﻣﺔ ﻓﻲ ﺑﺮﻣﺠﺔ ‪.Kotlin‬‬

‫ﺗﺜﺒﻴﺖ اﻻدوات‬

‫اﻓﺘﺢ ﺑﺮﻧـﺎﻣﺞ ‪ Eclipse‬واذﻫـﺐ اﻟﻰ ﺧﻴـﺎر ”‪ “Eclipse Market Place‬ﺳـ ــــــ ـﺘﻈﻬﺮ ﻟـﻚ ﻧـﺎﻓـﺬه‬
‫ﻣﺸﺎﺑﻬﻪ ﻟﻤﺎ ﻓﻲ اﻻﺳﻔﻞ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪14‬‬


‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪15‬‬
‫ﻓﻲ ﻣﺮ ﺑﻊ اﻟﺒﺤﺚ ا ﻛﺘﺐ ‪ kotlin‬وﺳﺘﻈﻬﺮ ﻟﻚ ﻧﺘﻴﺠﺔ ﻣﺸﺎﺑﻬﺔ ﻟﻤﺎ ﻓﻲ اﻟﺼﻮرة ﻗﻢ ﺑﺘﺜﺒﻴﺘﻬﺎ ﻓﻲ‬
‫اﻟﻐﺎﻟﺐ ﺳـ ـﺘﺤﺘﺎج اﻻﻧﺘﻈﺎر ﻟﺒﻌﺾ اﻟﻮﻗﺖ ﻟﺘﺤﻤﻴﻞ وذﻟﻚ ﻳﻌﺘﻤﺪ ﻋﻠﻰ ﺳـ ـﺮﻋﺔ اﻻﻧﺘﺮﻧﺖ ﻟﺪﻳﻚ ‪.‬‬
‫ﻓﻲ اﻟﻐﺎﻟﺐ ﺑﻌﺪ اﻟﺘﺤﺪﻳﺚ ﺳﺘﺤﺘﺎج اﻟﻰ اﻋﺎدة ﺗﺸﻐﻴﻞ‪Eclipse .‬‬

‫ﻣﺸﺮوع ‪Kotlin‬‬

‫اﻵن ﺑﻌﺪ اﻋﺎدة اﻟﺘﺸـﻐﻴﻞ ﺳـﺘﺴـﻄﻴﻊ اﺳـﺘﺨﺪام ‪ Eclipse‬ﻓﻲ ﺑﺮﻣﺠﺔ ﻣﺸـﺎر ﻳﻊ ‪ Kotlin .‬ﻣﻦ‬
‫ﻗﺎﺋﻤﺔ ‪ File -> New -> Others‬ﺑﻌﺪ ذﻟﻚ ﻗﻢ ﺑﺎﺧﺘﻴﺎر ”‪ “Kotlin project‬ﻣﻦ اﻟﻘﺎﺋﻤﺔ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪16‬‬


‫ﺳـ ـــ ـﻴﻨﺸـ ـــ ـﺊ ﻟﺪﻳﻚ ﻣﺸـ ـــ ـﺮوع ‪ Kotlin‬ﺟﺪﻳﺪ وﺳـ ـــ ـﺘﺠﺪ ﻣﻠﻒ ‪ Kotlin‬داﺧﻞ ﻣﺠﻠﺪ ‪ src .‬ﻋﻨﺪ‬
‫اﻟﻀﻐﻂ ﺑﺰر اﻟﻤﺎوس اﻻﻳﻤﻴﻦ ﻋﻠﻰ ﻣﺠﻠﺪ ‪ src‬ﺳﺘﺠﺪ اﻟﻜﺜﻴﺮ ﻣﻦ اﻟﺨﻴﺎرات ﺗﺨﺺ‪ Kotlin‬ﻻﻧﺸﺎء‬
‫ﻓﺼﺎﺋﻞ وا ﻳﻀﺎ ً ‪ interface‬اﻟﺦ‪...‬‬

‫ﺳﺘﺠﺪ ﻟﺪﻳﻚ ﺻﻮرة ﻣﺸﺎﺑﻬﻪ ﻟﻤﺎ ﻓﻲ اﻻﺳﻔﻞ‪.‬‬

‫اﻫﻼ ً ﺑﺎﻟﻌﺎﻟﻢ‬

‫ﻃﺎﻟﻤـﺎ رأ ﻳﺘﻬـﺎ ﻓﻲ ﺟﻤﻴﻊ ﻟﻐـﺎت‬


‫ﻋﻨـﺪ ﻓﺘﺢ ﻣﻠﻒ ‪ Hello.kt‬ﺳـ ــــــ ـﺘﺠـﺪ ﺷـ ــــــ ـﻔﺮة ﺑﺮﻣﺠﻴـﺔ اﻟﺘﻲ ﻻ ـ‬
‫اﻟﺒﺮﻣﺠﺔ‪“Hello World” .‬‬

‫{ )>‪fun main(args: Array<String‬‬


‫)"!‪println("Hello, World‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪17‬‬


‫ﻋﻨﺪ ﺗﺸﻐﻴﻞ اﻟﻤﺸﺮوع ﺳﺘﻈﻬﺮ ﻟﻚ رﺳﺎﻟﺔ ﻓﻲ ‪ console output‬وﺳﺘﻜﻮن اﻟﻨﺘﻴﺠﺔ ﻃﺒﺎﻋﺔ‬
‫رﺳﺎﻟﺔ "اﻫﻼ ﺑﺎﻟﻌﺎﻟﻢ"‪.‬‬

‫ﻟﻐﺔ ‪Kotlin‬‬

‫أوﻻ ‪ :‬ﻣﻘﺪﻣﺔ‬

‫ُﺗﻌـﺪ ‪ Kotlin‬ﻟﻐـﺔ ﺑﺮﻣﺠﻴـﺔ ﻛـﺎﺋﻨﻴـﺔ اﻟﺘﻮﺟـﻪ ﺗﻌﻤـﻞ ﻋﻠﻰ ‪ JVM‬وﻣﺘﻮاﻓﻘـﺔ ﻣﻊ ﺣﺰﻣـﺔ ‪JDK‬‬
‫ﺑﺸــﻜﻞ ﻛﺎﻣﻞ‪ ،‬ﺗﻢ اﻃﻼق وﺗﻄﻮ ﻳﺮ ﻫﺬه اﻟﻠﻐﺔ ﻋﺎم ‪٢٠١١‬م ﻣﻦ ﻗﺒﻞ ﺷــﺮﻛﺔ ‪ JetBrains‬اﻟﺸـ ـﺮﻛﺔ‬
‫اﻟﻤﻄﻮرة ﻷﻛﺒﺮ وأﺷـ ـــ ـﻬﺮ ﻣﺠﻤﻮﻋﺔ ‪ IDE‬ﻣﺴـ ـــ ـﺘﺨﺪﻣﻪ ﺣﻮل اﻟﻌﺎﻟﻢ ﻣﻊ ﻣﺨﺘﻠﻒ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ ‪،‬‬
‫وﺗﻌﺘﺒﺮ ﻟﻐﺔ ﻣﻔﺘﻮﺣﺔ اﻟﻤﺼـ ـﺪر ‪ .‬وﻟﻘﺪ ‪ Google‬ﺧﻼل ﻓﻌﺎﻟﻴﺎت ﻣﺆﺗﻤﺮ ‪ I/O‬ﻟﻠﻌﺎم ‪2017‬م ﺑﺪء‬
‫اﻟﺪﻋﻢ ﻟﻬﺬه اﻟﻠﻐﺔ وﺳـﻴﺘﻢ ﺗﻀـﻤﻴﻨﻬﺎ ﻓﻲ ﻧﺴـﺨﺔ ‪ Android Studio 3.0‬اﻟﺠﺪﻳﺪة ﺑﺪون اﻟﺤﺎﺟﺔ‬
‫ﻹﻋﺪادات اﻟﺘﺜﺒﻴﺖ اﻹﺿﺎﻓﻴﺔ‪.‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﺟﺎﻓﺎ ‪ Java‬أم ﻛﻮﺗﻠﻦ ‪Kotlin‬‬

‫ﺑـﺎﻟﻄﺒﻊ وﺟﻮد ﻛﻮﺗﻠﻦ ﻻ ﻳﻠﻐﻲ أﻫﻤﻴـﺔ اﻟﺠـﺎﻓـﺎ ووﺟﻮدﻫـﺎ واﺧﺘﻴـﺎرك ﻟﻠﺠـﺎﻓـﺎ أم ﻟﻠﻜﻮﺗﻠﻦ ﻳﻌﻮد‬
‫ﻟﻚ وﻟﻄﺒﻴﻌﺔ ﻋﻤﻠﻚ وﻟﻠﻔﺮ ﻳﻖ اﻟﺬي ﺗﻌﻤﻞ ﻣﻌﻪ ‪ ،‬أﻣﺎ ﺑﺎﻟﻤﺠﻤﻞ ﻓﺘﻌﺘﺒﺮ ﻛﻮﺗﻠﻦ ﻟﻐﺔ اﻧﺴـ ـــ ـﻴﺎﺑﻴﺔ‬
‫وﺳـﻬﻠﺔ اﻟﻔﻬﻢ وﺗﻮﻓﺮ اﻟﻮﻗﺖ واﻟﺠﻬﺪ ﻓﻤﻄﻮري اﻟﻠﻐﺔ ﺣﺮﺻـﻮ ﻋﻠﻰ ﺗﻼﻓﻲ اﻷﺧﻄﺎء وﺣﻞ ﻣﺸـﺎﻛﻞ‬
‫اﻟﺘﺮﻣﻴﺰ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪18‬‬


‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺰا ﻳﺎ ﻟﻐﺔ ﻛﻮﺗﻠﻦ ‪Kotlin‬‬

‫• ﻟﻐﺔ ﻣﻔﺘﻮﺣﺔ اﻟﻤﺼﺪر‪.‬‬


‫• ﺗﻮﻓﻴﺮ اﻟﻮﻗﺖ واﻟﺠﻬﺪ‪.‬‬
‫• ﻣﺘﻮاﻓﻘﺔ ﻣﻊ ‪. android studio‬‬
‫• أﺧﻄﺎء أﻗﻞ وﺗﺘﻤﻴﺰ ﺑﻘﻀﺎﺋﻬﺎ ﻋﻠﻰ ﻣﺸﻜﻠﺔ ‪. NullPointerException‬‬
‫• ﺗﺘﻤﻴﺰ ﺑﺎﻻﻧﺴﻴﺎﺑﻴﺔ‪.‬‬
‫• أ ﻛﺜﺮ أﻣﺎن‪.‬‬
‫• ﻣﺘﻌﺪدة اﻻﺳﺘﺨﺪاﻣﺎت ﻓﻴﻤﻜﻨﻚ ﻣﻦ ﺧﻼﻟﻬﺎ ﺗﻄﻮﻳﺮ ﻣﻮاﻗﻊ اﻻﻧﺘﺮﻧﺖ ‪ ،‬اﻟﺴﻴﺮﻓﺮات ‪،‬‬
‫ﺳﻄﺢ اﻟﻤﻜﺘﺐ إﻟﺦ ‪.. .‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪19‬‬


‫اﻟﻤﻘﺪﻣﺔ‬

‫ﺳـ ــــ ـﺄﻗﺪم ﻓﻲ ﻫﺬه اﻟﺠﺰﺋﻴﺔ ﻣﻘﺪﻣﺔ ﻋﻦ ﺟﻤﻴﻊ اﻟﻌﻨﺎﺻـ ــــ ـﺮ اﻟﺘﻲ ﺗﺤﺘﺎﺟﻬﺎ ﻟﻔﻬﻢ ﺗﺮﻛﻴﺒﺔ ﺑﺮﻣﺠﺔ‬
‫ﻟﻐـﺔ ‪ Kotlin‬ﺑـﺪا ﻳـًﺔ ﻣﻦ اﻟﻤﺘﻐﻴﺮات وﻣﺮورا ً ﻋﻠﻰ اﻟﺨﻮارزﻣﻴـﺎت اﻟﺨـﺎﺻـ ـــــــ ـﺔ ﺑﻬـﺎ اﻟـﺪوارة واﻻﺧﺘﻴـﺎر‬
‫واﻻﺣﺘﻤﺎﻻت‪.‬‬

‫ﺑﺎذن ﷲ ﺳـ ــ ـﻴﻜﻮن ﻫﻨﺎك ﺗﻔﺎﺻـ ــ ـﻴﻞ ﻣﺬﻛﻮرة وﻣﻤﻴﺰات ﺧﺎﺻـ ــ ـﺔ ﺑﻠﻐﺔ ‪ Kotlin‬اﻟﺘﻲ ﺗﺠﻌﻠﻬﺎ‬
‫ﺑﺪﻳﻞ ﺟﻴﺪ ﻟﻠﻐﺔ ‪ JAVA‬وا ﻳﻀـ ــ ـﺎ ً ﻓﻲ وﻗﺖ ﻻﺣﻖ ﺳـ ــ ـﻨﺘﻌﻠﻢ ﻛﻴﻒ ﻧﺴـ ــ ـﺘﺨﺪﻣﻬﺎ ﻣﻊ ‪JavaScript‬‬
‫وا ﻳﻀـ ــــــ ـﺎ ً ﻓﻲ ﺑﺮﻣﺠـﺔ ﺗﻄﺒﻴﻘـﺎت اﻻﻧـﺪروﻳـﺪ و اﻻﻳﻔﻮن‪ .‬اﻧـﺖ اﻻن ﻋﻠﻰ ﺑﻌـﺪ ﺧﻄﻮات ﺑﺴـ ــــــ ـﻴﻄـﺔ ﻣﻦ‬
‫ﻫﺎ وﺗﺠﻌـﻠﻚ‬
‫ﺣﺎﻓﺰ ـﻟﻚ ﻟﻼﻃﻼع ﻋﻠﻰ ﺗـﻔﺎﺻـ ــــــ ــﻴﻞ ﻟﻢ اذﻛﺮ ـ‬
‫اﻟـﺒﺪا ـﻳﺔ وـﺑﺈذن ﷲ ﺳـ ــــــ ـﺘﻜﻮن اـﻟﺪروس ـ‬
‫ﺗﺘﻮﺳﻊ ﻓﻲ ﺗﻌﻠﻢ اﻟﻠﻐﺔ وﻓﻖ اﺣﺘﻴﺎﺟﺎﺗﻚ‪.‬‬

‫• اﻟﻤﺘﻐﻴﺮات‬
‫• ادﺧﺎل اﻟﺒﻴﺎﻧﺎت‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪20‬‬


‫• اﻟﺘﻌﻠﻴﻘﺎت‬
‫• اﻟﻌﻤﻠﻴﺎت اﻟﺮ ﻳﺎﺿﻴﺔ‬
‫• اﻟﻌﻤﻠﻴﺎت اﻟﻤﻨﻄﻘﻴﺔ‬
‫• اﻟﺴﻼﺳﻞ اﻟﻨﺼﻴﺔ‬
‫• اﻟﻤﺼﻔﻮﻓﺎت‬
‫• اﻟﻨﻄﺎق‬
‫• ‪Visibility Modifiers‬‬
‫• ‪ESCAPE SEQUENCE‬‬
‫• ‪UNICODE‬‬
‫• )‪REGEX (Regular Expression‬‬

‫اﻟﻤﺘﻐﻴﺮات‬

‫ﻋﻨﺪ ﺗﻌﻠﻢ أي ﻟﻐﺔ ﻓﻼﺑﺪ ﻣﻦ اﻟﺘﻄﺮق ﻷﺳـ ـﺎﺳـ ـﻴﺎﺗﻬﺎ وﻣﻦ ﺿـ ـﻤﻦ ﻫﺬه اﻷﺳـ ـﺎﺳـ ـﻴﺎت اﻟﻤﻬﻤﺔ‬
‫ﻫﻲ ﻛﺘﺎﺑﺔ اﻟﻤﺘﻐﻴﺮات ﺑﻄﺮ ﻳﻘﺔ ﺻـ ــ ـﺤﻴﺤﺔ وﺳـ ــ ـﻨﺘﻌﺮف ﻓﻲ ﻫﺬا اﻟﺪرس ﻋﻠﻰ ﺗﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات‪،‬‬
‫واﻟﺜﻮاﺑﺖ‪ ،‬وﺷﺮوط اﻟﺘﺴﻤﻴﺔ ‪ ،‬ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ واﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‪.‬‬

‫اﻟﻤﺘﻐﻴﺮات ﻫﻲ ﻋﺒـﺎرة ﻋﻦ ﻗﻴﻤـﺔ ﻗـﺎﺑﻠـﺔ ﻟﻠﺘﻐﻴﻴﺮ اﺛﻨـﺎء ﻛﺘـﺎﺑـﺔ اﻟﺒﺮﻧـﺎﻣﺞ‪ ،‬ﻟﺘﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات‬
‫ﻓﻲ ﻟﻐﺔ ‪ kotlin‬ﻧﺴﺘﺨﺪام ﻛﻠﻤﺔ ‪ ،var‬وﺳﻨﺮى اﻷن أﺷﻜﺎل ﻣﺨﺘﻠﻔﺔ ﻟﻠﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮات‪.‬‬

‫أوﻻ ‪ :‬ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮات‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪21‬‬


‫‪ v‬اﺳ ﻨ ﺎد اﻟﻘ ﻴ ﻤ ﺔ‬

‫ﻳﻤﻜﻨﻚ اﻟﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮ ﻋﻦ ﻃﺮ ﻳﻖ ﺗﻌﺮ ﻳﻔﻪ واﺳﻨﺎد اﻟﻘﻴﻤﺔ ﻟﻪ ﻣﺒﺎﺷﺮة ‪.‬‬

‫”‪var myName=”Ahmed‬‬
‫‪var myAge=27‬‬

‫ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه ﻟﻢ ﻧﺬﻛﺮ اﻟﻨﻮع وﻟﻜﻦ اﺳـ ـﻨﺪﻧﺎ اﻟﻘﻴﻤﺔ ﻛﻴﻒ ﻳﺴـ ـﺘﻄﻴﻊ اﻟﺒﺮﻧﺎﻣﺞ ﻣﻌﺮﻓﺔ ﻧﻮع‬
‫اﻟﻤﺘﻐﻴﺮ؟ ﺑﻮاﺳﻄﺔ ‪ compiler‬اﻟﺬي ﻳﻘﻮم ﺑﻤﻌﺮﻓﺔ اﻟﻨﻮع ﻣﻦ ﺧﻼل اﻟﻘﻴﻤﺔ اﻟﻤﺴﻨﺪة ﻟﻪ‪.‬‬

‫اذا ﻗﻤﺖ ﺑﺎﺳ ـﻨﺎد ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ‪ Int‬ﻣﺜﻼ ً ﻓﺎﻧﻚ ﻟﻦ ﺗﺴ ـﺘﻄﻴﻊ ﺗﻐﻴﻴﺮﻫﺎ اﻟﻰ اي ﻧﻮع‬
‫آﺧﺮ‪.‬‬

‫‪var age = 12‬‬


‫‪age = "12 years old" // Error: type mismatch‬‬

‫‪ v‬ﺗﻌﺮﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮ واﻟﺘﻌﺮﻳﻒ ﺑﻨﻮﻋﻪ واﺳﻨﺎد اﻟﻘﻴﻤﺔ ﻣﺒﺎﺷﺮة‬

‫ﻳﻤﻜﻨﻚ اﻟﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮ واﻟﺘﻌﺮ ﻳﻒ ﺑﻨﻮﻋﻪ ﻣﻊ ﻣﺮاﻋﺎة ﻛﺘﺎﺑﺔ أول ﺣﺮف ﻣﻦ ﻧﻮﻋﻪ ﺑﺤﺮف‬
‫ﻛﺒﻴﺮ‪.‬‬

‫”‪var myName : String =”Ahmed‬‬


‫‪var myAge:Int=27‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪22‬‬


‫‪ v‬ﺗﻌ ﺮ ﻳﻒ ﺑﺎﻟﻤ ﺘﻐ ﻴﺮ و اﻟﺘ ﻌ ﺮ ﻳﻒ ﺑﻨﻮ ﻋ ﻪ و اﺳ ﻨﺎد اﻟﻘ ﻴ ﻤ ﺔ ﻻ ﺣ ﻘ ﺎ ً‬

‫ﻳﻤﻜﻨﻚ اﻟﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮ واﻟﺘﻌﺮ ﻳﻒ ﺑﻨﻮﻋﻪ ﻣﻊ ﻣﺮاﻋﺎة ﻛﺘﺎﺑﺔ أول ﺣﺮف ﻣﻦ ﻧﻮﻋﻪ ﺑﺤﺮف‬
‫ﻛﺒﻴﺮ ﻓﻲ ﺳﻄﺮ وﻳﻤﻜﻨﻨﺎ اﺳﻨﺎد اﻟﻘﻴﻤﺔ ﺧﻼل اﺳﻄﺮ اﻟﺒﺮﻧﺎﻣﺞ أو ﻓﻲ اﻟﺴﻄﺮ اﻟﺬي ﻳﻠﻴﻪ‪.‬‬

‫‪var myName : String‬‬


‫”‪myName=”Ahmed‬‬

‫ﻐـﻴﺮات ـﻓﻲ ـﻟﻐـ ــ ـﺔ ‪ kotlin‬أـﻧﻬـ ــ ـﺎ ﻻ ـﺗﺒـ ــ ـﺪأ ﺑـ ــ ـﺄي ـ‬


‫ﺣﺮف ـﻣﻦ اـﻟﺮـﻣﻮز‬ ‫ﻤـﺘ ـ‬
‫ﻌﺮ ـﻳﻒ اـﻟ ـ‬
‫ﻋﻨـ ــ ـﺪ ـﺗ ـ‬
‫ﻋﻰ ـ‬
‫ـﻳﺮا ـ‬
‫اﻟﻤﺨﺼﺼﺔ ﺑﺎﺳﺘﺜﻨﺎء )ـ( ﻣﺎ ﺗﻌﺮف ﺑﺎﻟﺸﺮﻃﺔ اﻟﺘﺤﺘﻴﺔ أو ‪.underscore‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬أﻧﻮاع اﻟﻤﺘﻐﻴﺮات‬

‫اﻟﻌﺪد اﻟﺼﺤﻴﺢ‬ ‫‪Int‬‬


‫ﻋﺪد ﺻﺤﻴﺢ ﻗﺼﻴﺮ‬ ‫‪Short‬‬
‫ﻋﺪد ﺻﺤﻴﺢ ﻃﻮ ﻳﻞ‬ ‫‪Long‬‬
‫ﻗﻴﻤﺔ ﻋﺸﺮ ﻳﺔ ﺑﺴﻴﻄﺔ‬ ‫‪Float‬‬
‫ﻗﻴﻤﺔ ﻋﺸﺮ ﻳﺔ أ ﻛﺜﺮ دﻗﺔ وﺗﺤﺪﻳﺪ‬ ‫‪Double‬‬
‫ﺣﺮف‬ ‫‪Char‬‬
‫ﺳﻠﺴﻠﺔ ﻧﺼﻴﺔ‬ ‫‪String‬‬
‫ﻣﺘﻐﻴﺮ ﻣﻨﻄﻘﻲ‬ ‫‪Bolean‬‬
‫ﻟـﻠـﺘـﻔـﺮ ﻳـﻖ ﺑـﻴـﻦ ‪ Double‬و ‪ Float‬ﻫـﻮ ﻋـﻨـ ــ ـﺪﻣـ ــ ـﺎ ﻧـﺮ ﻳـ ــ ـﺪ ﺗـﻌـﺮ ﻳـﻒ ﻣـﺘـﻐـﻴـﺮ ﻋﺸـ ـــــــ ـﺮي ﻣـﻦ‬
‫ﻧﻮع ‪ Float‬ﻧﻀﻊ ﻓﻲ ﻧﻬﺎﻳﺘﻪ ﺣﺮف ‪.f‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪23‬‬


‫ﻣﻊ ﻣﻼﺣﻈـ ـ ـﺔ ان اﻟﻤﺘﻐﻴﺮ ‪ double‬ﻳﺘﻜﻮن ﻣﻦ ‪ bit64‬ﺑﻌﻜﺲ ‪ float‬اﻟـ ـ ـﺬي ﻳﺘﻜﻮن ﻣﻦ‬
‫‪ bit32‬ﻓﻘﻂ‬

‫‪var cost:Double=12.9001111‬‬
‫‪var cost = 14.1655f‬‬

‫‪ v‬اﻟﺜ ﻮ اﺑﺖ‬

‫ﺗﻨﻄﺒﻖ ﻋﻠﻴﻪ ﻧﻔﺲ ﻣﻮاﺻـ ـــــ ـﻔﺎت اﻟﻤﺘﻐﻴﺮات ﺑﺎﺳـ ـــــ ـﺘﺜﻨﺎء أﻧﻪ ﻗﻴﻤﺔ ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ أﺛﻨﺎء‬
‫اﻟﺒﺮﻧﺎﻣﺞ وﻟﺘﻌﺮ ﻳﻒ اﻟﺜﺎﺑﺖ ﻧﺴـ ـــ ـﺘﺨﺪم ﻛﻠﻤﺔ ‪ ، val‬ﻳﻤﻜﻨﻨﺎ اﻻﺳـ ـــ ـﺘﻔﺎدة ﻣﻨﻪ ﻓﻲ ﺗﻌﺮ ﻳﻒ اﻟﻘﻮاﻧﻴﻦ‬
‫اﻟﺮ ﻳـﺎﺿـ ــــــ ـﻴـﺔ أو ﻟﻮ ﻛـﺎن ﻫﻨـﺎﻟـﻚ رﻗﻢ وﻇﻴﻔﻲ ﻓﻬﻮ ﺛـﺎﺑـﺖ ﺑـﺎﻟﻄﺒﻊ ﻻ ﻳﻤﻜﻦ ﺗﻐﻴﻴﺮه آو رﻗﻢ اﻟﻬﻮﻳـﺔ‬
‫اﻟﻮﻃﻨﻲ‪.‬‬

‫‪val id:Int=601121‬‬
‫‪id = 1234 // Error‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﺗﺤﻮﻳﻞ اﻟﻤﺘﻐﻴﺮات‬

‫ر ﺑﻤﺎ ﻛﺘﺒﺖ ﻣﺘﻐﻴﺮ واردت ﺗﺤﻮﻳﻞ اﻟﻰ اي ﻧﻮع آﺧﺮ ﻓﺎﻧﻚ ﻟﻦ ﺗﺴـﺘﻄﻴﻊ ذﻟﻚ ﺑﺴـﺒﺐ اﻧﻚ ﻗﺪ‬
‫ﺣـﺪدت ﻧﻮع اﻟﻤﺘﻐﻴﺮ او ان ‪ Compiler‬ﻗـﺪ ﻗـﺎم ﺑﺘﺤـﺪﻳـﺪ ﻧﻮع اﻟﻤﺘﻐﻴﺮ اذا ﻛـﺎن اﺳـ ــــــ ـﻨـﺎد اﻟﻘﻴﻤـﺔ‬
‫ﺑﺸ ـﻜﻞ ﻣﺒﺎﺷ ـﺮ‪ .‬ﺗﺤﻮﻳﻞ اﻟﻤﺘﻐﻴﺮات اﺑﺴ ـﻂ ﻣﻤﺎ ﺗﺘﺨﻴﻞ ﻟﻦ ﺗﺤﺘﺎج اﻟﻰ ا ﻛﺜﺮ ﻣﻦ ﺳ ـﻄﺮ او ذا ﻛﺮة‬
‫ﻛﺒﻴﺮه ﻟﺤﻔﻆ اﻟﻄﺮ ﻳﻘﺔ‪ .‬ﺗﺎﺑﻊ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪24‬‬


val number1: Int = 55
val number2: Long = number1.toLong()

.‫)( وﺑﺸﻜﻞ ﺳﻠﺲ وﺑﺴﻴﻂ‬toLong ‫ ﺑﺎﺳﺘﺨﺪام داﻟﺔ‬Long ‫ اﻟﻰ‬Int ‫ﻻﺣﻆ ﻗﻤﻨﺎ ﺑﺘﺤﻮﻳﻞ‬

: ‫ﻗﺎﺋﻤﺔ ﺑﺠﻤﻴﻊ دوال اﻟﺘﺤﻮﻳﻞ‬

toByte()

toShort()

toInt()

toLong()

toFloat()

toDouble()

toChar()

Boolean !‫ﻻﺣﻆ ﻻ ﻳﻮﺟﺪ ﺗﻐﻴﻴﺮ ﻟﻠﻤﺘﻐﻴﺮ‬

"hello world" ‫ ﺑﺮﻧﺎﻣﺞ‬: ً ‫راﺑﻌﺎ‬

fun main(args : Array<String>)


{

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 25 ‫اﻟﺼﻔﺤﺔ‬


‫)"‪println("hello world‬‬
‫}‬

‫ﻧﺮى ﻫﻨﺎ اﻟﻔﺮق اﻟﻮاﺿـ ـــــ ـﺢ ﺑﻴﻨﻬﺎ وﺑﻴﻦ ﻟﻐﺔ اﻟﺠﺎﻓﺎ ﻣﻦ ﺣﻴﺚ اﻻﺧﺘﺼـ ـــــ ـﺎر اﻟﺸـ ـــــ ـﺪﻳﺪ ﻓﻲ ﻛﺘﺎﺑﺔ‬
‫اﻟﺪاﻟﺔ واﻟﻮاﺿﺢ ﻓﻲ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ أ ﻳﻀﺎ‪.‬‬

‫ﺟﻤﻠـﺔ اﻟﻄﺒـﺎﻋـﺔ ﺗﻜﺘـﺐ ﺑﻄﺮ ﻳﻘﺘﻴﻦ اﻣـﺎ ‪ print‬او ‪ println‬اﻟﻔﺮق اﻟﻮﺣﻴـﺪ ﺑﻴﻨﻬﻤـﺎ ان اﻷﺧﻴﺮة‬
‫ﺗﺴﻤﺢ ﺑﺘﺮك ﺳﻄﺮ اﺳﻔﻞ اﻟﺠﻤﻠﺔ اﻟﻤﻄﺒﻮﻋﺔ‪.‬‬

‫‪ v‬ﻣ ﺜﺎل‬

‫)>‪fun main(args : Array<String‬‬


‫{‬
‫;‪var id:Int=105541‬‬
‫;"‪var carName:String="Corolla‬‬
‫;‪var price:Double= 1593.32‬‬
‫)"‪println("this car is : $carName and its price :$price‬‬
‫}‬

‫ﻓﻲ ﺟﻤﻠـﺔ اﻟﻄﺒـﺎﻋـﺔ ﻫـﺬه أردﻧـﺎ ﻛﺘـﺎﺑـﺔ ﺟﻤﻠـﺔ وﻣﻦ ﺛﻢ اﻟﻤﺘﻐﻴﺮ اﻟـﺬي ﻳﺤﻤـﻞ ﻗﻴﻤﺘﻬـﺎ وﻓﺼـ ــــــ ـﻠﻨـﺎ‬
‫ﺑﻴﻨﻬﻤﺎ ﺑﻌﻼﻣﺔ ‪ ، +‬ﻫﻨﺎﻟﻚ أ ﻳﻀﺎ ً ﻃﺮ ﻳﻘﺔ أﺧﺮى ﺳﻨﺘﻌﺮف ﻋﻠﻴﻬﺎ وﻫﻲ ‪:‬‬

‫)"‪println("this car is :$carName and its price: $price‬‬

‫اد ﺧ ﺎل اﻟﺒﻴﺎﻧﺎت‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪26‬‬


‫ﺳﺘﻘﺒﺎل اﻟﺒﻴﺎﻧﺎت ﻣﻦ اﻟﻤ ـ‬
‫ﺴﺘﺨﺪم وﻛﻴﻔﻴﺔ اﻟﺘﺤﻮﻳﻞ‬ ‫ﻓﻲ ﻫﺬا اﻟﺪرس ـ‬
‫ﺳﻨﺘﻌﺮف ﻋﻠﻰ ﻃﺮ ﻳﻘﺔ ا ـ‬
‫ﺑﻴﻦ اﻟﻤﺘﻐﻴﺮات ‪.‬‬

‫أوﻻ ‪ :‬داﻟﺔ ‪readLine‬‬

‫ﻧﺴـ ــــــ ـﺘﺨـﺪم ﻫـﺬه اﻟـﺪاﻟـﺔ ﻋﻨـﺪﻣـﺎ ﻧﺮ ﻳـﺪ اﺳـ ــــــ ـﺘﻘﺒـﺎل ﻗﻴﻤـﺔ ﻣﻦ اﻟﻤﺴـ ــــــ ـﺘﺨـﺪم ‪ ،‬ﻣﺜﻼ ﻃﻠﺒـﺖ ﻣﻦ‬
‫اﻟﻤﺴـﺘﺨﺪم أن ﻳﺪﺧﻞ اﺳـﻤﻪ و ﻋﻤﺮه واﻟﻤﺮﺣﻠﺔ اﻟﺪراﺳـﻴﺔ ﻓﻬﻨﺎ ﻧﻘﻮم ﺑﺎﺳـﺘﺨﺪام ﻫﺬه اﻟﺪاﻟﺔ ﻛﻤﺎ‬
‫ﺳﻨﺮى‪.‬‬

‫)"‪println("please enter your name‬‬


‫!!)(‪var yourName:String= readLine‬‬
‫)" ‪println("Hello $yourName‬‬

‫ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه ﻃﻠﺒﻨﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم أن ﻳﺪﺧﻞ اﺳﻤﻪ ﻣﻦ ﺧﻼل ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ ‪ ،‬وﻣﻦ ﺛﻢ‬
‫ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ وﺣﺪدﻧﺎ ﻧﻮﻋﻪ وﻗﻤﻨﺎ ﺑﺈﺳﻨﺎد اﻟﺪاﻟﺔ اﻟﺘﻲ ﺗﻘﻮم ﺑﺎﺳﺘﻘﺒﺎل ﻫﺬه اﻟﻘﻴﻤﺔ‪.‬‬

‫ﺗﻌﻨﻲ ﻗﻢ ﺑﻘﺮاءة ﻣﺎ ﺳﻮف ﻳﺪﺧﻠﻪ اﻟﻤﺴﺘﺨﺪم‪.‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﺘﺤﻮﻳﻞ‬

‫‪ readLine‬ﻫﺬه اﻟﺪاﻟﺔ ﺗﺴـ ـــ ـﺘﻘﺒﻞ ﻗﻴﻤﺔ ﻓﻘﻂ ﻧﺼـ ـــ ـﻴﺔ أي ﻣﻦ ﻧﻮع ‪ ،String‬وﻟﻜﻦ ﻓﻠﻨﻔﺮض‬
‫أﻧﻨﺎ أردﻧﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم إدﺧﺎل ﻋﻤﺮه واﻟﻌﻤﺮ ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﺻﺤﻴﺢ‪ ،‬ﻣﺎ اﻟﻌﻤﻞ إذا ؟‬

‫اﻟﺤﻞ ﺑﺴﻴﻂ ﺟﺪا ً ﻛﺎﻟﺘﺎﻟﻲ ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪27‬‬


‫)"‪println("please enter your age‬‬
‫)(‪var yourAge:Int= readLine()!!.toInt‬‬
‫)(‪yourAge.toInt‬‬

‫ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ اﻟﻌﻤﺮ ﻣﻦ ﻧﻮع ﻋﺪد ﺻـ ـــــ ـﺤﻴﺢ وﻣﻦ ﺛﻢ ﻗﻤﻨﺎ ﺑﺈﺳـ ـــــ ـﻨﺎد اﻟﺪاﻟﺔ ﻟﺘﻘﻮم ﺑﻘﺮاءة ﻣﺎ‬
‫ﻳﺪﺧﻠﻪ اﻟﻤﺴﺘﺨﺪم وﻣﻦ ﺛﻢ ﻗﻤﻨﺎ ﺑﺎﻟﺨﻄﻮة اﻟﺠﺪﻳﺪة اﻟﺘﺎﻟﻴﺔ وﻫﻲ اﻟﺘﺤﻮﻳﻞ ‪:‬‬

‫)(‪.toInt‬‬

‫ﻫـﺬا اﻟﺴـ ــــــ ـﻄﺮ ﻳﻌﻨﻲ أن ﻧﻘﻮم ﺑﺘﺤﻮﻳـﻞ اﻟﻌﻤﺮ ﻣﻦ ﻣﺘﻐﻴﺮ ﻧﺼـ ــــــ ـﻲ إﻟﻰ ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﻋـﺪد‬
‫ﺻﺤﻴﺢ وذﻟﻚ ﻷن داﻟﺔ‬

‫ﺗﻘﺮأ اﻟﻨﺺ ﻋﻠﻰ أﻧﻪ ﺳﻠﺴﻠﺔ ﻧﺼﻴﺔ ‪.readline‬‬

‫ﻟﻮ أردﻧﺎ اﻟﺘﺤﻮﻳﻞ إﻟﻰ ﻣﺘﻐﻴﺮ ﻧﻮﻋﻪ ﻋﺪد ﻋﺸﺮي‪:‬‬

‫)(‪Age.toFloat‬‬

‫ﻫﻨﺎ ﻟﻮ أردﻧﺎ اﻟﺘﺤﻮﻳﻞ إﻟﻰ ﻣﺘﻐﻴﺮ ﻧﻮﻋﻪ ﻋﺪد ﻋﺸﺮي ﻣﺰدوج ‪:‬‬

‫)(‪Age.toDouble‬‬

‫ﻻ ﻳﻘﺘﺼﺮ اﻟﺘﺤﻮﻳﻞ ﻋﻠﻴﻬﻢ ﻓﻴﻤﻜﻨﻨﺎ اﻟﺘﺤﻮﻳﻞ إﻟﻰ أي ﻧﻮع‪ ،‬ﺑﺎﺳﺘﺜﻨﺎء ‪:‬‬

‫ﻋﺪد ﺻـ ــــــ ـﺤﻴﺢ ﻻ ﻳﻤﻜﻦ ﺗﺤﻮﻳـﻠﻪ إﻟﻰ ﻣﻨﻄﻘﻲ وذـﻟﻚ ﻷن اﻟﻤﻨﻄﻘﻲ ﻳﺤ ـ‬


‫ﻤﻞ‬ ‫اﻟﻤﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ـ‬
‫ﻗﻴﻤﺔ ﺻﺢ أو ﺧﻄﺎء‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪28‬‬


‫ ﻣ ﺜﺎل‬v

fun main(args : Array<String>){

println("please enter length for rectangle :")


var n1:Int=readLine()!!.toInt()
println("please enter width for rectangle:")
var n2:Int=readLine()!!.toInt()
var distance = n1*n2
var circumference=2*(n1+n2)
println("The distance = $distance and the circumference =
$circumference")

‫ ﻧﺎﺗﺞ اﻟﺘ ﻨ ﻔ ﻴ ﺬ‬v

please enter length for rectangle :


7
please enter width for rectangle:
4
The distance = 28 and the circumference = 22

‫اﻟﺘﻌ ﻠﻴﻘ ﺎت‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 29 ‫اﻟﺼﻔﺤﺔ‬


‫ﻻ ﻳﺨﻔﻰ ﻋﻠﻴﻨ ـﺎ أن ﻛﺘ ـﺎﺑ ـﺔ اﻟﺘﻌﻠﻴﻘ ـﺎت ﻣﻔﻴ ـﺪة ﺟ ـﺪا ً ﻟﻠﻤﺒﺮﻣﺠﻴﻦ ﻓﻬﻲ ﺗﻌﻤ ـﻞ ﻋﻠﻰ ﺗﻌﺮ ﻳﻒ‬
‫ﻌﺔ اﻟﺒﺮﻣﺠـﻴﺔ ﻛـﻔﺎـﺋﺪﺗـﻬﺎ أو ـﻣﺎ اﻟﻐﺮض ﻣﻨـﻬﺎ ﻓﻲ ﺣﻴﻦ أـﻧﻪ ﻧﺴـ ــــــ ـﻲ ـﻣﺎ اﻟـﻬﺪف اـﻟﺬي ﻣﻦ أﺟـﻠﻪ‬
‫اﻟﻘﻄ ـ‬
‫ﻛﺘﺒﻬﺎ ‪ ،‬وﻫﻲ ﻻ ﺗﺆﺛﺮ ﻓﻲ ﻋﻤﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻛﻤﺎ ﻧﻌﻠﻢ ﻓﻼ ﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻣﻦ اﻷﺳـﺎس ﻷن اﻟﺒﺮﻧﺎﻣﺞ ﻻ‬
‫ﻳﺴﺘﻄﻴﻊ ﻗﺮأﺗﻬﺎ ‪.‬‬

‫وﻟﻠﺘﻌﻠﻴﻘـﺎت ﻧﻮﻋـﺎن اﻣـﺎ ان ﺗﻜﻮن ﺳـ ــــــ ـﻄﺮ ﻳـﺔ أي ﺗﻌﻠﻴﻖ ﻓﻲ ﺳـ ــــــ ـﻄﺮ واح ﻓﻘﻂ أو ﻣﺘﻌـﺪدة‬
‫اﻷﺳﻄﺮ‪ ،‬ﻣﺜﺎل‪:‬‬

‫‪ v‬ﻣ ﺘﻌ ﺪ د ة اﻷ ﺳ ﻄ ﺮ‬

‫*‪/‬‬
‫‪* calculate distance and‬‬
‫‪* circumference for rectangle‬‬
‫‪*/‬‬
‫‪var length:Int=5‬‬
‫‪var width:Int=7‬‬
‫‪var distance=length * width‬‬
‫)‪println(distance‬‬
‫)‪var circumference= 2*(length+width‬‬
‫)‪println(circumference‬‬

‫‪ v‬ﺳ ﻄ ﺮ ﻳﺔ‬

‫‪var num1=5 //value num1‬‬


‫)‪println(num1‬‬
‫‪num1--‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪30‬‬


‫)‪println(num1‬‬

‫اﻟﻌ ﻤ ﻠﻴﺎت اﻟﺮ ﻳﺎﺿ ﻴﺔ‬

‫ﺳـ ـﻨﺘﻄﺮق إﻟﻰ اﻟﻌﻤﻠﻴﺎت اﻟﺮ ﻳﺎﺿـ ـﻴﺔ اﻟﺘﻲ ﺗﻠﻌﺐ دور ﻣﻬﻢ وﻛﺒﻴﺮ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ‪ ،‬ﺳـ ـﻮف ﻧﻘﻮم‬
‫ﺑﺸـ ــ ـﺮح اﻟﻌﻤﻠﻴﺎت ‪ ،‬رﻣﻮزﻫﺎ ‪ ،‬ﻃﺮق ﻣﺨﺘﺼـ ــ ـﺮة ﻹﺟﺮاء اﻟﻌﻤﻠﻴﺎت وأ ﻳﻀـ ــ ـﺎ ً ﺳـ ــ ـﻨﺘﻌﻠﻢ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ‬
‫اﻟﺘﻌﻠﻴﻘﺎت‪.‬‬

‫أوﻻ ‪ :‬اﻟﺮﻣﻮز اﻟﺮﻳﺎﺿﻴﺔ‬

‫ﻓﻲ اﻟﺒﺪا ﻳﺔ ﻧﺤﺐ أن ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻒ اﻟﻌﻤﻠﻴﺎت اﻷﺳـ ــ ـﺎﺳـ ــ ـﻴﺔ وﻫﻲ ‪ :‬اﻟﺠﻤﻊ‪ ،‬اﻟﻄﺮح‪ ،‬اﻟﻀـ ــ ـﺮب‪،‬‬
‫اﻟﻘﺴﻤﺔ وﺑﺎﻗﻲ اﻟﻘﺴﻤﺔ‪.‬‬

‫اﻟﻌﻤﻠﻴﺔ‬ ‫اﻟﺮﻣﺰ‬
‫اﻟﺠﻤﻊ‬ ‫‪+‬‬
‫اﻟﻄﺮح‬ ‫–‬
‫اﻟﻀﺮب‬ ‫*‬
‫اﻟﻘﺴﻤﺔ‬ ‫‪/‬‬
‫ﺑﺎﻗﻲ اﻟﻘﺴﻤﺔ‬ ‫‪٪‬‬
‫ﻓﻲ اﻟﻌﻤﻠﻴﺎت اﻟﺮ ﻳﺎﺿـﻴﺔ ﻳﺮاﻋﻰ ﻋﻨﺪ ﺗﻨﻔﻴﺬﻫﺎ إذا ﻛﺎﻧﺖ ﺗﺘ ـ‬
‫ﻀﻤﻦ اﻷﻗﻮاس‪ ،‬وﻋﻤﻠﻴﺔ اﻟﻀـﺮب‪/‬‬
‫اﻟﻘﺴﻤﺔ‪ ،‬واﻟﺠﻤﻊ‪ /‬اﻟﻄﺮح اﻟﺘﺎﻟﻲ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪31‬‬


‫ﻧﺒﺪأ ﺑﺘﻨﻔﻴﺬ ﻣﺎ ﺑﻴﻦ اﻷﻗﻮاس وﻣﻦ ﺛﻢ ﻋﻤﻠﻴﺔ اﻟﻀﺮب‪ /‬اﻟﻘﺴﻤﺔ وﻣﻦ ﺛﻢ اﻟﺠﻤﻊ‪ /‬اﻟﻄﺮح‪.‬‬

‫ﻫﺬا ﻣﺜﺎل ﻳﺤﺴـﺐ ﻟﻨﺎ ﻣﺴـﺎﺣﺔ اﻟﻤﺴـﺘﻄﻴﻞ وﻣﺤﻴﻄﻪ‪ ،‬ﻧﺠﺪ أن اﻟﻤﺴـﺎﺣﺔ ﻫﻲ ﻣﺠﺮد ﻋﻤﻠﻴﺔ‬
‫ﺿـ ـــ ـﺮب ﻋﺎدﻳﺔ ‪ ،‬وﺑﺎﻟﻨﺴـ ـــ ـﺒﺔ ﻟﻠﻤﺤﻴﻂ ﻓﻬﻮ ﻳﻌﻄﻲ أوﻟﻮﻳﺔ اﻟﺘﻨﻔﻴﺬ إﻟﻰ اﻷﻗﻮاس وﻣﻦ ﺛﻢ ﻳﻀـ ـــ ـﺮب‬
‫اﻟﻨﺎﺗﺞ ﻓﻲ ‪.٢‬‬

‫‪var length:Int=5‬‬
‫‪var width:Int=7‬‬
‫‪var distance=length * width‬‬
‫)‪println(distance‬‬
‫)‪var circumference= 2*(length+width‬‬
‫)‪println(circumference‬‬

‫ﻤﺔ ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ واردﻧﺎ اﺟﺮاء ﻋﻤﻠﻴﺔ اﻟﻀـ ــــــ ـﺮب‬


‫ﻤﻞ ﻗﻴ ـ‬
‫ﻫـﻨﺎ ﻗﻤـﻨﺎ ﺑﺎﺧﺘﺼـ ــــــ ـﺎر ﻓـﻠﺪي ﻣﺘﻐﻴﺮ ﻳﺤ ـ‬
‫ﻋﻠﻴﻪ ﻓﻘﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ ‪ num *=3‬ﺑﺪﻻ ﻣﻦ ﻛﺘﺎﺑﺔ‪num=num*3 .‬‬

‫ﺳﻢ اﻟﻤﺘﻐﻴﺮ وﻣﻦ ﺛﻢ رﻣﺰ اﻟﻌﻤﻠﻴﺔ‬


‫ﺴﻤﺔ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ا ـ‬
‫ﻛﺬﻟﻚ اﻷﻣﺮ ﻟﻮ أردﻧﺎ اﺟﺮاء ﻃﺮح او ﻗ ـ‬
‫ﻋﻼﻣﺔ اﻟﻤﺴﺎواة وﻣﻦ ﺛﻢ اﻟﻌﺪد اﻟﺬي ﻧﺮﻏﺐ ﺑﺈﺟﺮاء اﻟﻌﻤﻠﻴﺔ ﻋﻠﻴﻪ‪.‬‬

‫‪var num=9‬‬
‫)‪println(num‬‬
‫‪num *=3‬‬
‫)‪println(num‬‬

‫ﺛﺎﻧﻴﺎ ‪Decrement & Increment :‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪32‬‬


‫ﻟﻨﻔﺮض أن ﻟﺪي ﻣﺘﻐﻴﺮ وأر ﻳﺪ ز ﻳﺎدﺗﻪ ﺑﻌﺪد واﺣﺪ ﻓﻘﻂ ﺳـ ـﻮف ﻧﻘﻮم ﺑﻌﻤﻠﻴﺔ ﺑﺴـ ـﻴﻄﺔ ﺟﺪا ً‬
‫وﻫﻲ ﺗﻌﺮف ﺑﺎﻟﺰ ﻳﺎدة أو‪.Increment‬‬

‫‪var num1=5‬‬
‫)‪println(num1‬‬
‫‪num1++‬‬
‫)‪println(num1‬‬

‫ﻫﻨﺎ ﻗﻤﻨﺎ ﺑﺎﻹﺧﺘﺼﺎر ﻓﺒﺪﻻ ﻣﻦ ﻛﺘﺎﺑﺔ ‪:‬‬

‫‪num=num+1‬‬

‫ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ ‪:‬‬

‫‪num1++‬‬

‫ﻟﻮ أردﻧﺎ ﻃﺮح ﻋﺪد واﺣﺪ ﻣﻦ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ﺳـ ـــــ ـﻮف ﻧﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟﻨﻘﺼـ ـــــ ـﺎن أو ﻣﺎ ﺗﻌﺮف‬
‫ﺑـ ‪Decrement‬‬

‫‪var num1=5‬‬
‫)‪println(num1‬‬
‫‪num1--‬‬
‫)‪println(num1‬‬

‫اﻟﻌ ﻤ ﻠﻴﺎت اﻟﻤ ﻨﻄ ﻘ ﻴﺔ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪33‬‬


‫ﺳـ ــــــ ـﻨﺘﻄﺮق إﻟﻰ اﻟﻌﻤﻠﻴـﺎت اﻟﻤﻨﻄﻘﻴـﺔ اﻟﺘﻲ ﻫﻲ أ ﻳﻀـ ـــــــ ـﺎ ﺑـﺪورﻫـﺎ ﺗﻠﻌـﺐ دور ﻣﻬﻢ وﻛﺒﻴﺮ ﻓﻲ‬
‫اﻟﺒﺮﻣﺠﺔ‪ ،‬ﺳـ ـــ ـﻮف ﻧﻘﻮم ﺑﺸـ ـــ ـﺮح اﻟﻌﻤﻠﻴﺎت‪ ،‬رﻣﻮزﻫﺎ‪ ،‬ﻃﺮق ﻣﺨﺘﺼـ ـــ ـﺮة ﻹﺟﺮاء اﻟﻌﻤﻠﻴﺎت وأ ﻳﻀـ ـــ ـﺎ ً‬
‫ﺳﻨﺘﻌﻠﻢ ﻛﻴﻔﻴﺔ ﻛﺘﺎﺑﺔ اﻟﺘﻌﻠﻴﻘﺎت‪.‬‬

‫أوﻻ ‪ :‬اﻟﺮﻣﻮز اﻟﻤﻨﻄﻘﻴﺔ‬

‫ﻓﻲ اﻟﺒـﺪا ﻳـﺔ ﻧﺤـﺐ أن ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻒ اﻟﻌﻤﻠﻴـﺎت اﻷﺳـ ـــــــ ـﺎﺳـ ــــــ ـﻴـﺔ وﻫﻲ‪ :‬اﺻـ ــــــ ـﻐﺮ‪ ،‬ا ﻛﺒﺮ‪ ،‬اﻟﻨﻔﻲ‪،‬‬
‫اﻟﻤﺴﺎواة‪.‬‬

‫اﻟﻌﻤﻠﻴﺔ‬ ‫اﻟﺮﻣﺰ‬
‫اﺻﻐﺮ‬ ‫<‬
‫ا ﻛﺒﺮ‬ ‫>‬
‫اﺻﻐﺮ ﻣﻦ او ﻳﺴﺎوي‬ ‫>=‬
‫ا ﻛﺒﺮ ﻣﻦ او ﻳﺴﺎوي‬ ‫<=‬
‫ﻳﺴﺎوي‬ ‫==‬
‫ﻋﻼﻣﺔ اﻟﻨﻔﻲ‬ ‫!‬
‫ﻻ ﻳﺴﺎوي‬ ‫=!‬

‫‪ v‬أﻣ ﺜ ﻠﺔ‬

‫§ ﻫﻨـﺎ ﻧﻄﻠـﺐ اﻟﺘﺤﻘﻖ ﺑﻴﻦ اﻟﻘﻴﻤﺘﻴﻦ ‪ number1‬و ‪ number2‬واﻟﻨـﺎﺗﺞ اﻟﻌـﺎﺋـﺪ ﻟﻨـﺎ‬


‫ﻫﻮ ﻣﻨﻄﻘﻲ ‪.true / false‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪34‬‬


‫‪var number1:Int=13‬‬
‫‪var number2:Int=20‬‬
‫)‪println(number1<number2‬‬

‫ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‪:‬‬

‫‪true‬‬

‫§ ﻋﺮﻓﻨــﺎ ﻣﺘﻐﻴﺮ ﻣﻨﻄﻘﻲ ﻳﺤﻤــﻞ ﻗﻴﻤــﺔ ‪ false‬وﻟﻜﻦ ﻧﻼﺣﻆ وﻗــﺖ اﻟﻄﺒــﺎﻋــﺔ ﻧﻔﻴﻨــﺎ‬
‫اﻟﻘﻴﻤﺔ أي اﻧﻪ ﺳﻴﻄﺒﻊ اﻟﻌﻜﺲ‪.‬‬
‫‪var isReal:Boolean=false‬‬
‫)‪println ("Ahmed loves Kotlin :"+ !isReal‬‬

‫ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‪:‬‬

‫‪Ahmed loves Kotlin :true‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﺒﻮاﺑﺎت اﻟﻤﻨﻄﻘﻴﺔ "اﻟﻤﻘﺎرﻧﺔ"‬

‫اﻟﺒﻮاﺑﺎت اﻟﻤﻨﻄﻘﻴﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﻫﻲ‪. AND , OR ,NOT :‬‬

‫‪ v‬ﺑﻮاﺑﺔ ‪AND‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪35‬‬


‫ﻟﻮ ﻛ ـﺎن ﻟ ـﺪي ﻗﻴﻤ ـﺔ ار ﻳ ـﺪ اﻟﺘﺤﻘﻖ ﻣﻨﻬ ـﺎ وﻟ ـﺪي ﻗﻴﻤ ـﺔ أﺧﺮى وأر ﻳ ـﺪ اﻟﺘﺤﻘﻖ ﻣﻨﻬ ـﺎ أ ﻳﻀـ ـــــــ ـﺎ‬
‫ﻌﺎ ﻣﺘﺤﻘﻖ‬ ‫ﺠﺐ ان ﻳﻜﻮن ـﻧﺎﺗﺠﻬ ـ‬
‫ﻤﺎ ﺟﻤﻴ ـ‬ ‫ﻌﻞ ذـﻟﻚ ﻋﻦ ﻃﺮ ﻳﻖ ﺑﻮاـﺑﺔ ‪ AND‬وﻟﻜﻦ ﻳ ـ‬
‫‪،‬ﻧﺴـ ــــــ ـﺘﻄﻴﻊ ﻓ ـ‬
‫أي اﻧﻪ ﻻ ﻳﻜﻮن اﻟﺸﺮط اﻷول ﺻﺤﻴﺤﺎ واﻷﺧﺮ ﺧﻄﺎء‪.‬‬

‫ﻟﺬﻟﻚ ﻧﺴـ ــــــ ـﺘﺨﺪﻣﻬﺎ ﻛﺜﻴﺮا ﻓﻲ اﻟﺘﺤﻘﻖ ﻣﻦ اﺳـ ــــــ ـﻢ اﻟﻤﺴـ ــــــ ـﺘﺨﺪم وﻛﻠﻤﺔ اﻟﻤﺮور ﻋﻨﺪﻣﺎ ﻳﻘﻮم‬
‫اﻟﻤﺴـ ـــ ـﺘﺨﺪم ﻣﻦ ادﺧﺎل اﻟﻤﻌﺮف اﻟﺨﺎص ﺑﻪ وﻛﻠﻤﺔ اﻟﻤﺮور اﻟﺨﺎﺻـ ـــ ـﺔ أ ﻳﻀـ ـــ ـﺎ ﺑﻪ وﻛﺎﻧﺘﺎ ﻛﻠﺘﺎﻫﻤﺎ‬
‫ﺻـ ــــــ ـﺤﻴﺤﺘـﺎن ﺣﻴﻨﻬـﺎ ﻳﻜﻮن اﻟﻨـﺎﺗﺞ ﻟـﺪﻳﻨـﺎ ‪ true‬ﺑـﺪاﺧـﻞ اﻟﺒﺮﻧـﺎﻣﺞ وﻧـﺎﺗﺞ اﻟﺘﻨﻔﻴـﺬ ﻫﻮ اﻟـﺪﺧﻮل إﻟﻰ‬
‫اﻟﺒﺮﻧﺎﻣﺞ وﻟﻜﻦ ﻓﻲ ﺣﺎل اﻧﻪ ادﺧﻞ اﻟﻤﻌﺮف اﻟﺨﺎص ﺑﻪ ﺑﺸـ ـﻜﻞ ﺻـ ـﺤﻴﺢ واﺧﻄﺎء ﻓﻲ ﻛﺘﺎﺑﺔ ﻛﻠﻤﺔ‬
‫اﻟﻤﺮور ﻓـﺎﻟﻨـﺎﺗﺞ ﺑـﺎﻟـﺪاﺧـﻞ ﺳـ ــــــ ـﻴﻜﻮن ﺧﻄـﺎء وﻧـﺎﺗﺞ اﻟﺘﻨﻔﻴـﺬ اﻟـﺬي ﻧﺮاه ﻟﻦ ﻳﺴـ ــــــ ـﻤﺢ ﻟﻲ ﺑـﺪﺧﻮل‬
‫اﻟﺒﺮﻧﺎﻣﺞ‪.‬‬

‫ﺗﻤﺜﻞ ﺑﺮﻣﺠﻴﺎ ً ﺑﻬﺬا اﻟﺮﻣﺰ )&&(‪.‬‬

‫وﻓﻲ اﻟﻤﺜﺎل ﻧﺠﺪ أﻧﻪ ﻟﺪي ﻗﻴﻤﺘﻴﻦ ار ﻳﺪ اﻟﺘﺤﻘﻖ ﻣﻨﻬﻤﺎ ﻛﻠﻬﻤﺎ ﺑﺄﻧﻬﻤﺎ ﻳﻌﻴﺪان ﻟﻲ ‪.true‬‬

‫‪var number1:Int = 7‬‬


‫‪var number2:Int = 4‬‬
‫)‪println(number1 < 10 && number2 < 5‬‬

‫‪output : true‬‬

‫‪ v‬ﺑﻮاﺑﺔ ‪OR‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪36‬‬


‫ﻫـﺬه اﻟﺒﻮاﺑـﺔ ﺗﺨـﺎﻟﻒ ‪ AND‬ﻓﻲ اﻧﻬـﺎ اذا ﻛـﺎن اﺣـﺪ اﻟﺸـ ــــــ ـﺮﻃﻴﻦ ﺻـ ــــــ ـﺤﻴﺢ ﻓﻬﻲ ﺗﻌﻴـﺪ ﻗﻴﻤـﺔ‬
‫ﺻﺤﻴﺤﺔ ‪ true‬أي اﻧﻬﺎ ﻻ ﺗﺸﺘﺮط ان ﻳﻜﻮن ﻛﻼﻫﻤﺎ ﺻﺤﻴﺤﻴﻦ‪.‬‬

‫ﺗﻤﺜﻞ ﺑﺮﻣﺠﻴﺎ ً ﺑﻬﺬا اﻟﺮﻣﺰ )||(‪.‬‬

‫اذا ﻛـﺎن اﺣـﺪﻫﻤـﺎ ﺻـ ــــــ ـﺤﻴﺢ ﻋﻠﻰ اﻷﻗـﻞ ﻓﻬﻲ ﺗﻌﻴـﺪ ‪ true‬اذا ﻻ ﺗﺸـ ــــــ ـﺘﺮط ان ﻳﻜﻮن ﻛﻼﻫﻤـﺎ‬
‫ﺻﺤﻴﺢ ﻛﻤﺎ ﻓﻲ ‪.AND‬‬

‫‪var number1:Int = 7‬‬


‫‪var number2:Int = 4‬‬
‫)‪println(number1 < 10 || number2 > 5‬‬

‫‪output : true‬‬

‫‪ v‬ﺑﻮاﺑﺔ ‪NOT‬‬

‫ﺗﻘﻮم ﺑﻨﻔﻲ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ ﻛﻤﺎ ﺷﺮﺣﻨﺎه ﻓﻲ اﻟﻤﺜﺎل اﻋﻼه‪.‬‬

‫‪ v‬ﺟﺪول ﻣﻘﺎرﻧﺔ‬

‫ﺑﻮاﺑﺔ ‪OR‬‬ ‫ﺑﻮاﺑﺔ ‪AND‬‬


‫ﺗﻤﺜﻞ ﺑﺮﻣﺠﻴﺎ ً ﺑﻬﺬا اﻟﺮﻣﺰ )||(‪.‬‬ ‫ﻞ ﺑﺮﻣﺠﻴﺎ ً ﺑﻬﺬا اﻟﺮﻣﺰ )&&(‪.‬‬
‫ﻟﻤﺜـ ــ ـﺎل ﻧﺠـ ــ ـﺪ أﻧـ ــ ـﻪ ﻟـ ــ ـﺪي ﻗﻴﻤﺘﻴﻦ ار ﻳـ ــ ـﺪ‬
‫ﻘﻖ ﻣﻨﻬﻤﺎ ﻛﻠﻬﻤﺎ ﺑﺄﻧﻬﻤﺎ ﻳﻌﻴﺪان ﻟﻲ ‪.true‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪37‬‬


‫اذا ﻛ ـﺎن اﺣ ـﺪﻫﻤ ـﺎ ﺻـ ــــــ ـﺤﻴﺢ ﻋﻠﻰ اﻷﻗ ـﻞ ﻓﻬﻲ‬ ‫‪5 > number2 && 10 > numb‬‬
‫ﺗﻌﻴـ ـﺪ‪ true‬اذا ﻻ ﺗﺸـ ــــــ ـﺘﺮط ان ﻳﻜﻮن ﻛﻼﻫﻤـ ـﺎ‬
‫ﺻﺤﻴﺢ ﻛﻤﺎ ﻓﻲ ‪.AND‬‬
‫‪var number1:Int = 7‬‬ ‫‪var number1:Int = 7‬‬
‫‪var number2:Int = 4‬‬ ‫‪var number2:Int = 4‬‬
‫)‪println(number1 < 10 || number2 > 5‬‬ ‫< ‪println(number1 < 10 && number2‬‬
‫ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬ ‫اﻟﺘﻨﻔﻴﺬ‬
‫‪true‬‬ ‫‪true‬‬

‫اﻟﺴ ﻼ ﺳ ﻞ اﻟﻨﺼ ﻴﺔ‬

‫ﻻ ﻳﺨﻔﻰ ﻋﻠﻴﻨﺎ أن اﻟﺴـ ـﻼﺳـ ـﻞ اﻟﻨﺼـ ـﻴﺔ ﻫﻴﺎ ﻣﻦ أﻫﻢ اﻟﻤﺪﺧﻼت واﻟﻤﺨﺮﺟﺎت أ ﻳﻀـ ـﺎ ً ﻓﻲ أي‬
‫ﻟﻐﺔ ﻧﺘﻌﻠﻤﻬﺎ‪ ،‬ﻛﻴﻒ ﻧﺴـ ـﺘﻄﻴﻊ اﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﺑﺎﻟﺤﺬف‪ ،‬اﻹﺿـ ـﺎﻓﺔ‪ ،‬اﺧﺘﺒﺎرﻫﺎ وﺣﺘﻰ اﻟﺘﻌﺎﻣﻞ ﻣﻊ‬
‫اﻷﺣﺮف وﺳﻮف ﻧﺘﻄﺮق ﻟﻬﺬا اﻟﺤﺪث ﻓﻲ درﺳﻨﺎ اﻟﻴﻮم‪.‬‬

‫ﺳﻨﺬﻛﺮ ﻓﻲ اﻟﺒﺪا ﻳﺔ ﻣﺜﺎل ﺑﺴﻴﻂ ﺗﻌﺮ ﻳﻔﻲ ﻟﻠﺴﻼﺳﻞ اﻟﻨﺼﻴﺔ‪:‬‬

‫"‪var name:String="Ahmed‬‬
‫)‪println(name‬‬

‫ﻓﻲ ﻫﺬا اﻟﻤﺜﺎل اﻟﺒﺴـ ــ ـﻴﻂ ﻗﻤﻨﺎ ﺑﻄﺒﺎﻋﺔ اﻻﺳـ ــ ـﻢ اﺣﻤﺪ‪ ،‬اﻷن ﺳـ ــ ـﻨﺴـ ــ ـﺘﻌﺮض أﻫﻢ اﻟﺪوال اﻟﺘﻲ‬
‫ﺗﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺴﻼﺳﻞ اﻟﻨﺼﻴﺔ ﻣﺴﺘﺨﺪﻣﻴﻦ اﻟﻤﺜﺎل اﻟﺤﺎﻟﻲ‪:‬‬

‫‪length v‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪38‬‬


‫ﻋﻨﺪﻣﺎ ﻧﺮ ﻳﺪ ﻣﻌﺮﻓﺔ ﻃﻮل اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ‪.‬‬

‫"‪var name:String="Ahmed‬‬
‫)‪println(name.length‬‬

‫‪plus v‬‬

‫ﻋﻨﺪﻣﺎ ﻧﺮ ﻳﺪ إﺿﺎﻓﺔ ﺳﻠﺴﻠﺔ ﻧﺼﻴﺔ ﻟﻠﺴﻠﺴﻠﺔ اﻟﺴﺎﺑﻘﺔ‪.‬‬

‫"‪var name:String="Ahmed‬‬
‫))"‪println(name.plus(" aljuaid‬‬

‫‪get v‬‬

‫ﻋﻨﺪﻣﺎ ﻧﺮ ﻳﺪ اﺳﺘﺮﺟﺎع اﻟﻘﻴﻤﺔ اﻟﺘﻲ ﻳﺸﻴﺮ إﻟﻴﻬﺎ اﻟﻌﻨﻮان أو اﻟﻤﺆﺷﺮ ]‪.[index‬‬

‫"‪var name:String="Ahmed‬‬
‫))‪println(name.get(3‬‬

‫‪equals v‬‬

‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة ﻣﻦ اﻟﺪاﻟﺔ ﻫﻴﺎ ﻣﻨﻄﻘﻴﺔ ﻓﻬﻲ ﺗﺴ ـﺘﺨﺪم ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺗﻄﺎﺑﻖ اﻟﻘﻴﻢ وﺳ ـﻮف‬
‫ﻧﺮى ذﻟﻚ ﺑﺎﻟﻤﺜﺎل‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪39‬‬


var name:String="Ahmed"
println(name.equals("Khaled"))

hashCode v

.‫وﻫﻲ ﻟﺠﻠﺐ اﻟﺘﺮﻣﻴﺰ اﻟﺨﺎص ﺑﺎﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ‬

var name:String="Ahmed"
println(name.hashCode())

replaceFirst v

.‫ﺗﻘﻮم ﺑﺎﺳﺘﺒﺪال اول ﺣﺮف ﻣﻦ اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ ﻓﻘﻂ‬

var name:String="Ahmed"
println(name.replaceFirst("A","G"))

reversed v

.‫ﺗﻘﻮم ﺑﻌﻜﺲ اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ‬

var name:String="Ahmed"
println(name.reversed())

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 40 ‫اﻟﺼﻔﺤﺔ‬


‫‪toLowerCase v‬‬

‫ﺗﻘﻮم ﺑﺘﺤﻮﻳﻞ ﺣﺮوف اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ إﻟﻰ ﺣﺮوف ﺻﻐﻴﺮة‪.‬‬

‫"‪var name:String="Ahmed‬‬
‫))(‪println(name.toLowerCase‬‬

‫‪toUpperCase v‬‬

‫ﺗﻘﻮم ﺑﺘﺤﻮﻳﻞ ﺣﺮوف اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ إﻟﻰ ﺣﺮوف ﻛﺒﻴﺮة‪.‬‬

‫"‪var name:String="Ahmed‬‬
‫))(‪println(name.toUpperCase‬‬

‫‪removeRange v‬‬

‫ﻟﻮ ﻃﺮأ ﻓﻲ ﺑﺎﻟﻚ ﺣﺬف ﺣﺮف ﻣﻦ اﻟﺴـ ـﻠﺴـ ـﻠﺔ اﻟﻨﺼـ ـﻴﺔ أو ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺤﺮوف اﻟﻤﺘﺼـ ـﻠﺔ‬
‫ﻓﻜﻞ ﻣﺎ ﻳﺘﻮﺟﺐ ﻋﻠﻴﻚ ﻓﻌﻠﻪ ﻫﻮ ﺗﺤﺪﻳﺪ اﻟﻌﻨﻮان اﻟﺬي ﺳـ ـــ ـﺘﺒﺪأ ﺑﻪ ]‪ [index‬واﻟﺬي ﺳـ ـــ ـﺘﻨﺘﻬﻲ‬
‫ﻋﻨﺪه‪.‬‬

‫"‪var name:String="Ahmed‬‬
‫))‪println(name.removeRange(2,4‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪41‬‬


‫”‪var name:String=“Ahmed‬‬ ‫ﻓـﻠـﻨـﻔـﺮض ﻣـﺜـﻼ أﻧـ ــ ـﻚ اردت ان ﺗـﻘـﺘـﻄـﻊ ﺟـﺰًء ﻣـﻦ‬
‫))‪println(name.take(3‬‬
‫ـﻠﺴـ ـــــ ـﻠﺔ اﻟﻨﺼـ ـــــ ـﻴﺔ وﺗﻘﻮم ﺑﺤﺬﻓﻬﺎ ﻛﻞ ﻣﺎ ﻋﻠﻴﻚ ﻫﻮ‬
‫ﺪ اﻟﻌﻨﻮان اﻟﺬي ﺗﺮ ﻳﺪ ﺑﺪء اﻗﺘﻄﺎع اﻟﺴﻠﺴﻠﺔ ﻣﻨﻪ‪.‬‬
‫”‪var name:String=“Ahmed‬‬ ‫‪ f‬ﺗﻌﻮد ﺑﺄول ﺣﺮف ﻣﻦ اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ‪.‬‬
‫))(‪println(name.first‬‬
‫”‪var name:String=“Ahmed‬‬ ‫ﺗﻌﻮد ﺑﺄول ﺣﺮف ﻣﻦ اﻟﺴﻠﺴﻠﺔ اﻟﻨﺼﻴﺔ‪.‬‬
‫))(‪println(name.last‬‬
‫”‪var name:String=“Ahmed‬‬ ‫ﺤﺬف ﺣﺮف ﻣﻦ اﻟﺴـ ــــــ ـﻠﺴـ ــــــ ــﻠﺔ‬
‫ﻫﺬه اـﻟﺪاـﻟﺔ ﺗﻘﻮم ﺑ ـ‬
‫‪ d‬ـ‬
‫))‪println(name.drop(1‬‬
‫ﻴﺔ ﻋﻦ ﻃﺮ ﻳﻖ ﺗﺤﺪﻳﺪ ﻋﻨﻮاﻧﻬﺎ‪.‬‬

‫اﻟﻤ ﺼ ﻔ ﻮ ﻓ ﺎت‬

‫اﻟﻤﺼـﻔﻮﻓﺎت ﺗﻌﺘﺒﺮ اﻟﺤﻞ اﻟﺴـﺤﺮي إذا ﻛﻨﺖ ﺗﺮ ﻳﺪ ادﺧﺎل او ﻃﺒﺎﻋﺔ ﺑﻴﺎﻧﺎت ﻛﺜﻴﺮة ‪ ،‬ﻓﺮﺋﻴﺲ‬
‫اﻟﻘﺴـ ـــﻢ ﻳﺴـ ـــﺘﻄﻴﻊ ﺣﺼـ ـــﺮ ﺑﻴﺎﻧﺎت ﻣﻦ ﻫﻢ ﻓﻲ ﻗﺴـ ـــﻤﻪ داﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻋﻦ ﻃﺮ ﻳﻖ اﻟﻤﺼـ ـــﻔﻮﻓﺔ ‪،‬‬
‫ﻛﺬﻟﻚ اﻟﻤﻌﻠﻢ ﻳﺴﺘﻄﻊ ﻃﺒﺎﻋﺔ ﺑﻴﺎﻧﺎت اﻋﺪاد ﻛﺒﻴﺮة ﻣﻦ ﻃﻠﺒﺘﻪ ﻓﻘﻂ ﺑﻀﻐﻄﺔ اﻟﺰر ‪ ،‬واﻟﻤﺼﻔﻮﻓﺔ‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻃﺮ ﻳﻘﺔ ﺗﻌﺮ ﻳﻔﻬﺎ وﺗﻌﺒﺌﺘﻬﺎ‬
‫ﻣﻌﺮوف أﻧﻬﺎ ﻣﺠﻤﻮﻋﺔ ﺑﻴﺎﻧﺎت ﻣﻦ ﻧﻔﺲ اﻟﻨﻮع ‪ .‬ـ‬
‫وﻃﺒﺎﻋﺘﻬﺎ‪:‬‬

‫أوﻻ ‪ :‬ﺗﻌﺮﻳﻒ اﻟﻤﺼﻔﻮﻓﺔ‬

‫}‪var myArray=Array<Int>(5){0‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪42‬‬


‫ﻓﻲ اﻟﺒﺪا ﻳﺔ ﻧﻌﺮف اﻟﻤﺘﻐﻴﺮ وﻣﻦ ﺛﻢ ﺑﻌﺪ ﻋﻼﻣﺔ = ﻧﺤﺪد أن ﻧﻮع اﻟﻤﺘﻐﻴﺮ ﻣﺼـ ـﻔﻮﻓﺔ وﻣﻦ ﺛﻢ‬
‫ﻧﺤﺪد ﻧﻮﻋﻬﺎ >‪ <Int‬أﻧﻬﺎ ﻣﻦ ﻧﻮع ﻋﺪد ﺻ ـﺤﻴﺢ )‪(5‬ﺗﺸ ـﻴﺮ إﻟﻰ ﻃﻮل اﻟﻤﺼ ـﻔﻮﻓﺔ أي أﻧﻬﺎ ﺗﺤﻮي‬
‫ﺑﺪاﺧﻠﻬﺎ ‪ ٥‬ﻋﻨﺎﺻﺮ‪ ،‬وﻓﻲ اﻟﻨﻬﺎﻳﺔ }‪ {0‬ﻧﺤﺪد أن اﻟﻤﺆﺷﺮ أو ‪ index‬ﻳﺒﺪأ ﻣﻦ اﻟﺼﻔﺮ‪.‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬إدﺧﺎل ﻗﻴﻢ ﻟﻠﻤﺼﻔﻮﻓﺔ‬

‫ﺣﺴﻨﺎ ً اﻷن ﻋﺮﻓﻨﺎ ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ أر ﻳﺪ إدﺧﺎل ﻗﻴﻢ ﺑﺪاﺧﻠﻬﺎ أي ﺗﻌﺒﺌﺘﻬﺎ ‪ ،‬ﻧﺴﺘﻄﻴﻊ ﺗﻌﺒﺌﺘﻬﺎ‬
‫ﺑﻬﺬه اﻟﻄﺮ ﻳﻘﺔ‬

‫‪myArray[0]=12‬‬

‫وﻟﻜﻦ ﻫﺬه اﻟﻄﺮ ﻳﻘﺔ ﺳـ ـﺘﻜﻮن ﻣﺮﻫﻘﺔ ﻟﻮ ﻛﺎﻧﺖ اﻟﻤﺼـ ـﻔﻮﻓﺔ ﻟﺪي ﻃﻮ ﻳﻠﺔ أي ﺗﺤﻤﻞ ﻋﻨﺎﺻـ ـﺮ‬
‫ﻛﺜﻴﺮة‪ ،‬واﻟﺤﻞ اﻟﺴﺤﺮي ﻛﺎﻟﻌﺎدة ﻫﻮ اﺳﺘﺨﺪام اﻟﺪوارة أو ‪ ، loop‬ﻓﻘﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام ‪: for loop‬‬

‫ﻃﺒﻌـﺎ ً ﻫـﺬا اﻟﻤﺜـﺎل اﻟـﺬي ﺳـ ــــــ ـﻮف ﻧﻄﺮﺣـﻪ ﻫﻮ ﻟﻮ أﻧﻨـﺎ أردﻧـﺎ ﻃﺒـﺎﻋـﺔ اﻷرﻗـﺎم ﻣﻦ ‪ ٤-٠‬ﺑـﺎﻟﺘﺮﺗﻴـﺐ‬
‫ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ‪:‬‬

‫)‪for(i in 0..5‬‬
‫{‬
‫‪myArray[i]=i‬‬
‫)]‪println(myArray[i‬‬
‫}‬

‫أوﻻ ً ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪43‬‬


‫)‪for(i in 0..5‬‬

‫اﻟﺤﻠﻘﺔ اﻟﺘﻲ ﻟﺪي ﻋﺪد ﻋﻨﺎﺻﺮﻫﺎ ﺳﺘﺔ ‪ ،‬ﻣﻦ ‪ ٠‬إﻟﻰ ‪.٥‬‬

‫ﺛﺎﻧﻴﺎ ً ‪:‬‬

‫‪ i myArray[i]=i‬ﺗﻌﺒﺮ ﻋﻦ إذا ﻛﺎﻧﺖ اﻟﺤﻠﻘﺔ ﺗﺒﺪأ ﻣﻦ ‪ ٠‬ﻓﺄﺟﻌﻞ أ ﻳﻀ ـﺎ ﻗﻴﻤﺔ اﻟﻌﻨﺼ ـﺮ = ‪، ٠‬‬


‫وﻫﻜﺬا‪:‬‬

‫‪myArray[0]=0‬‬
‫‪myArray[1]=1‬‬
‫…‬

‫ﺛﺎﻟﺜﺎ ً ‪:‬‬

‫وﻫﻲ اﻟﺨﻄﻮة اﻷﺧﻴﺮة ﺑﻌﺪ اﻟﺘﻌﺒﺌﺔ وﻫﻲ ﻃﺒﺎﻋﺔ اﻟﻌﻨﺎﺻﺮ‪.‬‬

‫ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ ‪:‬‬

‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬

‫ﺣﺴﻨﺎ ً وﻟﻜﻦ ﻟﻮ أردﻧﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم ﺗﻌﺒﺌﺔ ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ ؟ اﻟﺤﻞ ﺑﺴﻴﻂ ﺟﺪا ً ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪44‬‬


‫)"‪println("Enter Number for ARRAY‬‬

‫{ )‪for (i in 0..4‬‬
‫)(‪myArray[i] = readLine()!!.toInt‬‬
‫}‬

‫)(‪myArray[i] = readLine()!!.toInt‬‬

‫ﻫﺬا ﻳﻌﻨﻲ أﻧﻪ ﺑﻜﻞ ﻋﻨﺼ ـﺮ ﻣﻦ ‪ ٤ – ٠‬ﻗﻢ ﺑﻄﻠﺐ اﻟﻤﺴ ـﺘﺨﺪم أن ﻳﺪﺧﻞ رﻗﻢ وﻟﻤﺎذا ﻣﻦ ‪-٠‬‬
‫‪ ٤‬وذﻟﻚ ﻷن ﻣﺼﻔﻮﻓﺘﻨﺎ ﻋﺪد ﻋﻨﺎﺻﺮﻫﺎ ‪.٥‬‬

‫ﺛﺎﻟﺜﺎ ‪ :‬ﻃﺒﺎﻋﺔ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ‬

‫ﺣﺴـ ـﻨﺎ ﻫﻜﺬا ﺗﻢ أﻣﺮ اﻹدﺧﺎل‪ ،‬ﺗﺒﻘﻰ ﻟﻨﺎ أﻣﺮ وﻫﻮ ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺔ ﻫﺬه اﻟﻌﻨﺎﺻـ ـﺮ اﻟﺘﻲ أدﺧﻠﻬﺎ‬
‫؟ ﻧﺴﺘﻄﻴﻊ اﻟﻄﺒﺎﻋﺔ إﻣﺎ ﺑﺎﻟـ ‪: while or for‬‬

‫‪//printed by for‬‬
‫)"‪println("printed by for‬‬
‫{)‪for(i in myArray‬‬
‫)‪println(i‬‬
‫}‬

‫‪//printed by while‬‬
‫)"‪println("printed by while‬‬
‫‪var i=0‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪45‬‬


while (i<myArray.size){
println(myArray[i])
i++
}

: ‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
Enter Number for ARRAY
5
4
3
2
1
printed by for
5
4
3
2
1
printed by while
5
4
3
2
1

: ‫ ﺗﻜﻮن اﻟﺸﻔﺮة ﺑﻬﺬا اﻟﺸﻜﻞ‬for ‫ ﻟﻠﻤﺼﻔﻮﻓﻪ ﺑﺎﺳﺘﺨﺪام‬index ‫§ ﻟﻮ اردﻧﺎ ﻃﺒﺎﻋﺔ‬


for ((index, value) in myArray.withIndex()) {
println("the element at $index is $value")

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 46 ‫اﻟﺼﻔﺤﺔ‬


‫}‬

‫§ ﻣﺼﻔﻮﻓﺔ ﻧﺼﻴﺔ ‪:‬‬


‫}""{)‪var student=Array<String>(6‬‬
‫)"‪println("Enter name your student :‬‬
‫{)‪for(i in 0..5‬‬
‫!!)(‪student[i]=readLine‬‬
‫}‬

‫{)‪for(i in 0..4‬‬
‫)]‪println(student[i‬‬
‫}‬

‫ﻫـﻨﺎ ﻋﺮﻓـﻨﺎ ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﺳـ ــــــ ـﻠﺴـ ــــــ ـﻠﺔ ﻧﺼـ ــــــ ـﻴﺔ ﻷﺳـ ــــــ ـﻤﺎء اﻟﻄﻼب ﻣﻊ ﻣﺮاﻋﺎة } “”{ اﻟﻘﻴﻤﺔ‬
‫اﻻﻓﺘﺮاﺿ ـﻴﺔ ﻫﻨﺎ ﻻ ﻧﺴ ـﺘﻄﻴﻊ ﻛﺘﺎﺑﺘﻬﺎ ‪ ٠‬أو أي ارﻗﻢ وذﻟﻚ ﻷن اﻟﻤﺼ ـﻔﻮﻓﺔ ﻧﺼ ـﻴﺔ ﻓﻨﻘﻮم ﺑﻮﺿ ـﻊ‬
‫ﻋﻼﻣﺘﻲ اﻟﺘﻨﺼـ ــــــ ـﻴﺺ وﻧ ـﺪﻋﻬ ـﺎ ﻓ ـﺎرﻏ ـﺔ ‪ ،‬ﻛﻤ ـﺎ ﺗﺮون ﻫﻮ ﻧﻔﺲ اﻷﻣﺮ اﺣﺘﺠﻨ ـﺎ إﻟﻰ دوارﺗ ـﺎن اﻷوﻟﻰ‬
‫ﻹدﺧﺎل اﻷﺳﻤﺎء ﻣﻦ اﻟﻤﺴﺘﺨﺪم واﻷﺧﺮى ﻟﻄﺒﺎﻋﺔ ﺑﻴﺎﻧﺎت ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ‪.‬‬

‫راﺑﻌﺎ ‪ :‬اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﺼﻔﻮﻓﺎت‬

‫ﺑﺎﻟﻄﺒﻊ اذا ﻛﺎن ﻟﺪي ﻣﺼـ ـــ ـﻔﻮﻓﺔ وﻫﻲ ﺗﺠﻤﻊ ﻛﺒﻴﺮ ﻟﻠﺒﻴﺎﻧﺎت ﻓﺴـ ـــ ـﻨﺤﺘﺎج إﻟﻰ دوال ﺳـ ـــ ـﺮ ﻳﻌﺔ‬
‫وﺟـﺎﻫﺰة ﻟﻠﺘﻌـﺎﻣـﻞ ﻣﻊ ﻫـﺬه اﻟﻤﺼـ ــــــ ـﻔﻮﻓـﺔ‪ ،‬ﻓﻲ اﻟﺠـﺪول ادﻧـﺎه اﺷـ ــــــ ـﻬﺮ اﻟـﺪوال اﻟﻤﺴـ ــــــ ـﺘﺨـﺪﻣـﺔ‬
‫ﻟﻠﻤﺼﻔﻮﻓﺔ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪47‬‬


‫اﻻﺛﻨﺎن ﻟﻬﻢ ﻧﻔﺲ اﻻﺳـ ـــﺘﺨﺪام وﻫﻮ ﻣﻌﺮﻓﺔ ﻋﺪد ﻋﻨﺎﺻـ ـــﺮ اﻟﻤﺼـ ـــﻔﻮﻓﺔ‬ ‫‪count – size‬‬
‫ﻓﻨﻘﻮم ﺑﻜﺘﺎﺑﺔ‪:‬‬
‫)‪println(myArray.size‬‬
‫ﻟﺠﻠـ ــ ـﺐ ﻋﻨﺼـ ــــــ ـﺮ ﻓﻲ اﻟﻤﺼـ ــــــ ـﻔﻮﻓـ ــ ـﺔ ﻧﻘﻮم ﺑـ ــ ـﺎﺳـ ــــــ ـﺘﺨـ ــ ـﺪام ‪ get‬وﻧﻤﺮر‬ ‫‪get‬‬
‫ﻟﻬﺎ ‪ index‬اﻟﻌﻨﺼﺮ‪:‬‬
‫))‪println(myArray.get(index‬‬
‫اﺳـ ــــــ ـﺘﺒﺪال ﻗﻴﻤﺔ ﻋﻨﺼـ ــــــ ـﺮ ﻓﻲ اﻟﻤﺼـ ــــــ ـﻔﻮﻓﺔ ﺑﻘﻴﻤﺔ ﺟﺪﻳﺪة ﺳـ ــــــ ـﻨﻘﻮم‬ ‫‪set‬‬
‫ﺑﺎﺳﺘﺨﺪام ‪ set‬وﻧﻤﺮر ﻟﻬﺎ ‪ index‬اﻟﻌﻨﺼﺮ واﻟﻘﻴﻤﺔ اﻟﺠﺪﻳﺪة‪ ،‬ﻫﻜﺬا‪:‬‬
‫))‪println(myArray.set(index,new value‬‬
‫وﻫﻲ ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ اﻟﻌﻨﺼﺮ أي ان ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ اﻟﻌﺎﺋﺪ ﺳﻴﻜﻮن‬ ‫‪equals‬‬
‫ﻣﻨﻄﻘﻲ اﻣﺎ ‪:true or false‬‬
‫))‪println(myArray.equals(value‬‬
‫ﻟﺘﺮﺗﻴﺐ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪sort‬‬
‫))(‪println(myArray.sort‬‬
‫ﻹﻳﺠﺎد ا ﻛﺒﺮ ﻋﻨﺼﺮ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪max‬‬
‫))(‪println(myArray.max‬‬
‫ﻹﻳﺠﺎد اﺻﻐﺮ ﻋﻨﺼﺮ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪min‬‬
‫))(‪println(myArray.min‬‬
‫ﻟﺠﻠﺐ اﺧﺮ ﻋﻨﺼﺮ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪last‬‬
‫))(‪println(myArray.last‬‬
‫ﻟﺠﻠﺐ اول ﻋﻨﺼﺮ ﻓﻲ اﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪first‬‬
‫))(‪println(myArray.first‬‬
‫ﻓﻠﺘﺮة اﻟﻌﻨﺎﺻﺮ او اﻟﺒﺤﺚ داﺧﻞ اﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪filter‬‬
‫} ‪val search = myArray.filter { x -> x <= 3‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪48‬‬


‫ﻫﻨﺎ ﺳـ ــــ ـﻴﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﻌﻨﺎﺻـ ــــ ـﺮ داﺧﻞ اﻟﻤﺼـ ــــ ـﻔﻮﻓﺔ ذات اﻟﻘﻴﻢ ‪ 3‬او‬
‫اﻗﻞ‪.‬‬
‫ﻟﻌﺮض اﻟﺘﺮﻣﻴﺰ اﻟﺨﺎص ﺑﺎﻟﻤﺼﻔﻮﻓﺔ‪:‬‬ ‫‪hashcode‬‬
‫))(‪println(myArray.hashCode‬‬
‫ﺗﻘﻮم ﺑﻌﻜﺲ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ ‪:‬‬ ‫‪reserved‬‬
‫))(‪println(myArray.reversed‬‬

‫اﻟﻨﻄ ﺎق‬

‫اﻟﺤﺪود او اﻟﻨﻄﺎق ﻣﻦ اﻟﻤﺴـ ـــــ ـﻤﻰ ﻧﻌﻠﻢ او ﻧﻔﻬﻢ ان ﻟﻬﺎ ﻗﻴﻤﺔ ﺑﺪا ﻳﺔ وﻗﻴﻤﺔ ﻧﻬﺎﻳﺔ ﻣﺤﺪودة‬
‫وﺑﺪاﺧﻠﻬﺎ ارﻗﺎم او ﺣﺮوف اﻟﺦ‪.‬‬

‫أوﻻ ‪ :‬اﻟﻨﻄﺎق‬

‫ﻌﺔ ﺑﻴﻦ ‪ ١‬إﻟﻰ ‪ ١٠‬أو اﻷﺣﺮف ﻣﻦ أ إﻟﻰ ي ‪ ،‬أي اـﻧﻪ ﻣﺠﻤﻮ ـ‬


‫ﻋﺔ ﻗﻴﻢ‬ ‫ﻳﻌﺒﺮ ﻋﻦ اﻷرـﻗﺎم ﻣﺜﻼ اﻟﻮاﻗ ـ‬
‫ﻣﺘﺴـ ــــــ ـﻠﺴـ ــــــ ـﻠـﺔ ﻟﻬـﺎ ﻗﻴﻤـﺔ ﺑـﺪا ﻳـﺔ وﻟﻬـﺎ ﻧﻬـﺎﻳـﺔ ‪ ،‬ﻓﻲ ﺗﻌﺒﻴﺮاﺗﻨـﺎ اﻟﺒﺮﻣﺠﻴـﺔ ﻧﺤﺘـﺎﺟﻬـﺎ ﻓﻬﻲ ﺗﻮﻓﺮ اﻟﻮﻗـﺖ‬
‫وﺗﻌﺘﺒﺮ ﺗﻌﺒﻴﺮ ﻣﻤﺘﺎز وﺳﺮ ﻳﻊ‪.‬‬

‫‪ v‬أﻣ ﺜ ﻠﺔ‬

‫ﻟﻄﺒﺎﻋﺔ اﻷرﻗﺎم اﻟﺰوﺟﻴﺔ ﻣﻦ ‪ ١‬إﻟﻰ ‪: ٢٠‬‬

‫‪var evenNumbers=1..20‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪49‬‬


for(i in evenNumbers){
if(i%2==0)
{
println(i)
}
}

output : 2 4 6 8 10 ..20

:‫اﻟﺒﺤﺚ ﻋﻦ ﻗﻴﻤﺔ ﻣﺎ إذا ﻛﺎﻧﺖ ﻣﻮﺟﻮدة ﻓﻲ ﻫﺬا اﻟﻨﻄﺎق ام ﻻ‬

var evenNumbers = 1..20


var i = 30
if (i in evenNumbers) {
println("the value in the range")
} else {
println("not found")
}

not found

:‫ﺗﻄﺒﻴﻖ ﻧﻔﺲ اﻟﻤﺜﺎل ﻋﻠﻰ اﻟﺴﻼﺳﻞ اﻟﻨﺼﻴﺔ‬

var word:String="Hello , My name is Ahmed"

var letter:Char='b'
if(letter in word){
println("the value in the word")

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 50 ‫اﻟﺼﻔﺤﺔ‬


‫{ ‪} else‬‬
‫)"‪println("not found‬‬
‫}‬

‫‪not found‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﻘﻔﺰة أو ‪step‬‬

‫اﻟﻘﻔﺰة ﻫﻮ ﺑﻤﻌﻨﻰ ﻳﻜﻮن ﻟﺪي ﻧﻄﺎق وﻟﻜﻦ ار ﻳﺪ ﻋﻨﺎﺻـﺮ ﻣﻌﻴﻨﺔ ﺗﺒﻌﺪ ﻋﻦ ﺑﻌﻀـﻬﺎ ﺑﻤﺴـﺎﻓﺔ‬
‫ﺛـﺎﺑﺘـﻪ‪ ،‬ﺑﻤﻌﻨﻰ أﺧﺮ ﻧﻌﻠﻢ أن اﻷرﻗـﺎم اﻟﺰوﺟﻴـﺔ ﺗﺒﻌـﺪ ﻋﻦ ﺑﻌﻀـ ــــــ ـﻬـﺎ رﻗﻤﻴﻦ ﻓﻌﻨـﺪﻣـﺎ اﻋﻤـﻞ ﻗﻔﺰ ﻓﻲ‬
‫اﻟﻨﻄﺎق اﺳﺘﻄﻴﻊ اﻟﻮﺻﻮل إﻟﻴﻪ‪.‬‬

‫‪var numbers= 2..20‬‬


‫{)‪for(i in numbers step 2‬‬
‫)‪println(i‬‬
‫}‬

‫‪output : 2 4 6 8 10 ..20‬‬

‫ﺛﺎﻟﺜﺎ ‪ :‬اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻨﻄﺎق‬

‫‪downTo v‬‬

‫ﻟﻄﺒﺎﻋﺔ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ ﺗﻨﺎزﻟﻴﺎ‪ ،‬ﻣﺜﺎل‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪51‬‬


‫{)‪for (i in 10 downTo 0‬‬
‫)‪println(i‬‬
‫}‬

‫‪until v‬‬

‫ﻟﻄﺒﺎﻋﺔ اﻟﻌﻨﺎﺻﺮ ﺗﺼﺎﻋﺪﻳﺎ‪ ،‬ﻣﺜﺎل‪:‬‬

‫{)‪for (i in 1 until 10‬‬


‫)‪println(i‬‬
‫}‬

‫ﻫﻨـﺎ ﻳﺒـﺪأ ﻳﻄﺒﻊ ﻣﻦ رﻗﻢ ‪ ١‬وﻳﺘﻮﻗﻒ ﻋﻨـﺪ ‪ ، ٩‬وذﻟـﻚ ﻷن ‪ until‬ﺗﻌﻨﻲ ﺣﺘﻰ أي ﻛـﺂﻧﻨـﺎ ﻧﻘﻮل‬
‫ﺣﺘﻰ ﺗﺮى ‪ ١٠‬ﻓﺘﻮﻗﻒ ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺔ اﻟﺮﻗﻢ ‪ ١٠‬ﻓﺴﻨﺠﻌﻞ اﻟﺮﻗﻢ ﻳﻨﺘﻬﻲ ﻋﻨﺪ ‪١١‬‬

‫داﻟ ـﺔ ﺟ ـﺎﻫﺰة ﻟﻮ اردﻧ ـﺎ اﻟﺒﺤ ـﺚ ﺑ ـﺪاﺧ ـﻞ اﻟﻨﻄ ـﺎق و واﻟﻘﻴﻤ ـﺔ اﻟﻌ ـﺎﺋ ـﺪة ﻣﻦ‬ ‫‪contains‬‬
‫اﻟﺒﺤﺚ ﻣﻨﻄﻘﻴﺔ‪ ،‬ﻣﺜﺎل‪:‬‬
‫"‪var letter="A".."Z‬‬
‫))"‪println(letter.contains("D‬‬
‫داﻟﺔ ﻟﻠﺘﺤﻘﻖ ﻫﻞ اﻟﻨﻄﺎق ﺧﺎﻟﻲ ام ﻻ واﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة ﻣﻨﻄﻘﻴﺔ‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪isEmpty‬‬
‫"‪var letter="A".."Z‬‬
‫))(‪println(letter.isEmpty‬‬
‫ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﻌﻨﺼﺮ اﻟﺬي ﻳﺒﺪأ ﻓﻴﻪ اﻟﻨﻄﺎق "ﻧﻘﻂ؛ اﻟﺒﺪا ﻳﺔ"‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪start‬‬
‫‪var letter="A".."Z‬‬
‫)‪println(letter.start‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪52‬‬


‫ﻃﺒﺎﻋﺔ اﺧﺮ ﻋﻨﺼﺮ ﻳﻨﺘﻬﻲ ﻋﻨﺪه اﻟﻨﻄﺎق "ﻧﻘﻂ؛ اﻟﻨﻬﺎﻳﺔ"‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪endInclusive‬‬
‫"‪var letter="A".."Z‬‬
‫)‪println(letter.endInclusive‬‬
‫اﻟﺘﺮﻣﻴﺰ اﻟﺨﺎص ﺑﺎﻟﻨﻄﺎق ﻧﻔﺴﻪ‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪hashCode‬‬
‫"‪var letter="A".."Z‬‬
‫))(‪println(letter.hashCode‬‬
‫ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﻣﻄﺎﺑﻘﺔ اﻟﻘﻴﻢ‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪equals‬‬
‫"‪var letter="A".."Z‬‬
‫"‪var newLetter="A".."Z‬‬
‫))‪println(letter.equals(newLetter‬‬
‫ﻫﻨـ ـﺎ ﻋﺮﻓﻨـ ـﺎ ﻣﺘﻐﻴﺮ اﺧﺮ ﻟـ ـﻪ ﻧﻔﺲ اﻟﻨﻄـ ـﺎق ‪ ،‬وﻗﻤﻨـ ـﺎ ﺑـ ـﺎﻻﺧﺘﺒـ ـﺎر ﻫـ ـﻞ ﻫﻢ‬
‫ﻣﺘﺴﺎوﻳﺎن ام ﻻ‪.‬‬
‫ﻟﻄﺒﺎﻋﺔ ﻋﻨﺎﺻﺮ اﻟﻤﺼﻔﻮﻓﺔ ﺗﻨﺎزﻟﻴﺎ‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪downTo‬‬
‫{)‪for (i in 10 downTo 0‬‬
‫)‪println(i‬‬
‫}‬
‫ﻟﻄﺒﺎﻋﺔ اﻟﻌﻨﺎﺻﺮ ﺗﺼﺎﻋﺪﻳﺎ‪ ،‬ﻣﺜﺎل‪:‬‬ ‫‪until‬‬
‫{)‪for (i in 1 until 10‬‬
‫)‪println(i‬‬
‫}‬
‫ﻫﻨـ ـﺎ ﻳﺒـ ـﺪأ ﻳﻄﺒﻊ ﻣﻦ رﻗﻢ ‪ ١‬وﻳﺘﻮﻗﻒ ﻋﻨـ ـﺪ ‪ ، ٩‬وذﻟـ ـﻚ ﻷن ‪ until‬ﺗﻌﻨﻲ‬
‫ﺣﺘﻰ أي ﻛـﺂﻧﻨـﺎ ﻧﻘﻮل ﺣﺘﻰ ﺗﺮى ‪ ١٠‬ﻓﺘﻮﻗﻒ ﻟﻮ أردﻧـﺎ ﻃﺒـﺎﻋـﺔ اﻟﺮﻗﻢ ‪١٠‬‬
‫ﻓﺴﻨﺠﻌﻞ اﻟﺮﻗﻢ ﻳﻨﺘﻬﻲ ﻋﻨﺪ ‪١١‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪53‬‬


‫‪Visibility Modifiers‬‬

‫أوﻻ ‪ :‬رؤﻳﺔ اﻟﻤﺘﻐﻴﺮات‬

‫ﻳﻘﺼـ ــــــ ـﺪ ﺑﺮؤﻳﺔ اﻟﻤﺘﻐﻴﺮات وﻫﻲ ﻣﺠﺎل رؤ ﻳﺘﻬﺎ ﻓﻲ اﻟﻤﺸـ ــــــ ـﺮوع وﻟﻜﻲ ﻧﻌﺮﻓﻬﺎ ﻻﺑﺪ أن ﻧﻌﺮف‬
‫أﻧﻮاع اﻟﻘﻴﻮد ﻋﻠﻰ اﻟﻤﺘﻐﻴﺮات‪:‬‬

‫اﻟ ـﺪوال واﻟﻤﺘﻐﻴﺮات اﻟ ـﺬي ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻔﻬ ـﺎ داﺋﻤ ـﺎ ﻫﻲ ﺑ ـﺎﻷﺳـ ــــــــ ـﺎس‬ ‫‪Publi‬‬
‫‪public‬أي أﻧﻪ ﻋﻨﺪﻣﺎ ﻧﻘﻮم ﺑﺎﻟﺘﺎﻟﻲ‪:‬‬
‫‪var num1:Int=0‬‬
‫ﺳـ ــــــ ـﻮاء ﻗﻤﻨــﺎ ﺑﻮﺿـ ــــــ ـﻊ اﻟﻜﻠﻤــﺔ أم ﻟﻢ ﻧﻀـ ــــــ ـﻌﻬــﺎ ﻫﻲ ﺗﻠﻘــﺎﺋﻴــﺎ ﻫﻜــﺬا‬
‫ﺗﻌﺘﺒﺮ‪ public .‬ﺣـﺪود رؤﻳـﺔ اﻟﻤﺘﻐﻴﺮات اﻟﻤﻌﺮﻓـﺔ ﺑﻬـﺬه اﻟﻄﺮ ﻳﻘـﺔ ﺗﻜﻮن‬
‫ﻣﺮﺋﻴﺔ ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺸﺮوع ﻛﺎﻣﻞ‬
‫ﺣـﺪود رؤﻳـﺔ اﻟﻤﺘﻐﻴﺮات واﻟـﺪوال اﻟﻤﻌﺮﻓـﺔ ﺑﻬـﺬه اﻟﻄﺮ ﻳﻘـﺔ ﺗﻜﻮن ﻓﻘﻂ‬ ‫‪internal‬‬
‫ﻓﻲ ‪ module‬اﻟﺤﺎﻟﻲ‪:‬‬
‫‪internal var num2:Int=0‬‬
‫اﻟـﻤـﺘـﻐـﻴـﺮات واﻟـ ــ ـﺪوال اﻟـﺘـﻲ ﺗـﻌـﺮف ﺑـﻬـ ــ ـﺬا اﻟـﻨـﻮع ﻻ ﻳـﻤـﻜـﻦ رؤ ﻳـﺘـﻬـ ــ ـﺎ إﻻ‬ ‫‪Protected‬‬
‫ﺑﺎﻟﺘﺼﻨﻴﻔﺎت اﻟﻮارﺛﺔ‪:‬‬
‫‪protected var num3:Int=0‬‬
‫ﻻ ﻳﻤﻜﻦ رؤﻳﺘﻪ إﻻ ﺑﺪاﺧﻞ اﻟﺘﺼﻨﻴﻒ اﻟﺬي ﺗﻢ ﺗﻌﺮ ﻳﻔﻪ ﻓﻴﻪ ﻓﻘﻂ‬ ‫‪private‬‬
‫‪private var num4 :Int =0‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪54‬‬


‫ﺛﺎﻧﻴﺎ ‪ :‬أﻫﻤﻴﺔ رؤﻳﺔ اﻟﻤﺘﻐﻴﺮات‬

‫وﺿـ ـﻊ ﻗﻴﻮد ﻋﻠﻰ اﻟﻤﺘﻐﻴﺮات ﺗﺠﻌﻞ اﻟﻮﺻـ ـﻮل إﻟﻰ ﻫﺬه اﻟﻤﺘﻐﻴﺮات ﺳـ ـﻬﻞ ‪ ،‬ﻓﻤﺜﻼ ﻟﻮ أردت‬
‫أن أﻋﺮف ﻣﺠﻤﻮﻋﺔ ﻣﺘﻐﻴﺮات وأر ﻳﺪ ﻓﻘﻂ أن أﺻـ ــــــ ﻞ إﻟﻰ ﻣﺘﻐﻴﺮ واﺣﺪ ﻓﻲ اﻟﻤﺸـ ــــــ ﺮوع ﻛﻜﻞ ﻫﻨﺎ‬
‫ﻧﺴﺘﻄﻴﻊ وﺿﻌﻪ ﻋﺎم ﻟﻨﺘﻤﻜﻦ ﻣﻦ رؤ ﻳﺘﻪ ﻓﻲ ﻛﺎﻓﺔ أﺟﺰاء اﻟﻤﺸﺮوع ‪ ،‬وﺑﻘﻴﺔ اﻟﻤﺘﻐﻴﺮات ﻧﺴﺘﻄﻴﻊ‬
‫ﺗﻌﺮ ﻳﻔﻪ ﻋﻠﻰ ﺣﺴـﺐ اﺳـﺘﺨﺪاﻣﻬﺎ ﻫﻞ ﻓﻘﻂ ﺳـﺄ ﻛﺘﻔﻲ ﺑﺄن ﻳﻜﻮن اﻟﻤﺘﻐﻴﺮ ﻓﻲ اﻟﺘﺼـﻨﻴﻒ اﻟﻮارث‬
‫أو ﻓﻲ ‪ module‬اﻟﺤﺎﻟﻲ‪.‬‬

‫‪ESCAPE SEQUENCE‬‬

‫أوﻻ ‪ :‬ﻣﺎﻫﻲ اﻻﺧﺘﺼﺎرات أو اﻷواﻣﺮ اﻟﺴﺮﻳﻌﺔ‬


‫‪ESCAPE SEQUENCE‬‬

‫ﻫﻲ رﻣﻮز ﺗﺴـ ــــ ـﺎﻋﺪﻧﺎ اﺛﻨﺎء ﻛﺘﺎﺑﺔ اﻷواﻣﺮ اﻟﺒﺮﻣﺠﻴﺔ ﻋﻠﻰ أداء أﻣﺮ ﻣﻌﻴﻦ‪ ،‬ﻣﺜﻞ‪ :‬ﻧﺰول ﺳـ ــــ ـﻄﺮ‪،‬‬
‫ﺗﺮك ﻣﺴﺎﻓﺔ ﻣﻌﻴﻨﺔ‪ ،‬اﻟﺒﺪء ﻣﻦ أول اﻟﺴﻄﺮ …إﻟﺦ‪.‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬اﻟﺮﻣﻮز وﻣﻌﺎﻧﻴﻬﺎ‬

‫‪ v‬اﻟﺮ ﻣ ﺰ ‪\ n‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪55‬‬


‫ﻳﺸﻴﺮ إﻟﻰ ﻧﺰول ﺳﻄﺮ ﻋﻨﺪ ﻋﻤﻠﻴﺔ اﻟﻄﺒﺎﻋﺔ وﻫﻜﺬا ﻳﻜﺘﺐ‪:‬‬

‫)"‪print("Hello World\n‬‬

‫‪ v‬اﻟﺮ ﻣ ﺰ ‪\ t‬‬

‫ﻟﻄﺒﺎﻋﺔ ﻣﺴﺎﺣﺔ ﺑﻴﻦ اﻟﻜﻠﻤﺎت ﻋﻨﺪ ﻋﻤﻠﻴﺔ اﻟﻄﺒﺎﻋﺔ وﻫﻜﺬا ﻳﻜﺘﺐ‪:‬‬

‫)"‪println("hello ,\t we learn Kotlin programming‬‬

‫‪ v‬اﻟﺮ ﻣ ﺰ ‪\ b‬‬

‫ﻣﺴﺢ أﺧﺮ ﺣﺮف ﻣﻦ اﻟﻜﻠﻤﺔ اﻟﻤﻮﺿﻮع ﻋﻨﺪﻫﺎ اﻟﺮﻣﺰ ‪ ،‬وﻫﻜﺬا ﻳﻜﺘﺐ‪:‬‬

‫)" ‪println("hello ,we learn Kotlin programming\b‬‬

‫‪ v‬اﻟﺮ ﻣ ﺰ ‪\ r‬‬

‫ﺗﻘﻮم ﺑﻤﺴـﺢ اﻟﺴـﻄﺮ ﻛﺎﻣﻼ ﻟﻮ وﺿـﻌﺖ اﺧﺮ اﻷﻣﺮ ‪ ،‬وﻟﻮ ﻛﺎن ﻓﻲ اﻣﺮ ﻃﺒﺎﻋﺔ ﻣﺜﻼ ووﺿـﻌﺘﻪ ﻓﻲ‬
‫اﻟﻤﻨﺘﺼـﻒ ﻳﻤﺴـﺢ ﻣﺎ ﻗﺒﻠﻪ ‪ ،‬ﻧﺴـﺘﻄﻴﻊ اﻻﺳـﺘﻔﺎدة ﻣﻦ ﻫﺬا اﻷﻣﺮ ﻓﻲ ﻋﻤﻠﻴﺔ ﺗﺤﺘﺎج إﻟﻰ اﻟﻌﺪ ﻣﺜﻼ‬
‫ﻟﻮ اردﻧـﺎ ﻗﻴـﺎس ﻧﺴـ ــــــ ـﺒـﺔ ﺗﺤﻤﻴـﻞ ﺑﺮﻧـﺎﻣﺞ ﻣﻌﻴﻦ أﻻ ﻳﻈﻬﺮ ﻟﻨـﺎ ﻓﻲ اﻟﺒـﺪا ﻳـﺔ ‪… ٪٤٠، ٪١٩ ، ٪١٥‬إﻟﺦ‬
‫وﻫﻜﺬا ﻧﻤﺴﺢ اﻟﻌﺪد وﻧﻀﻊ ﻋﺪد ﺟﺪﻳﺪ ﻟﻠﺘﻘﺪم‪:‬‬

‫{)‪for(x in 1..800‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪56‬‬


‫{)‪for ( i in 1..500‬‬
‫)‪print("\r"+i‬‬
‫}}‬

‫‪ v‬اﻟﺮ ﻣ ﺰ ' \‬

‫ﻣﺨﺼﺺ ﻟﻄﺒﺎﻋﺔ ﻋﻼﻣﺔ ‘ ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺘﻬﺎ ﻓﻲ اﻟﻨﺺ ‪ ،‬ﻣﺜﺎل‪:‬‬

‫)" ‪println("hello ,we learn \'Kotlin\' programming‬‬

‫‪ v‬اﻟﺮ ﻣ ﺰ " \‬

‫ﻣﺨﺼﺺ ﻟﻄﺒﺎﻋﺔ ﻋﻼﻣﺔ ” ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺘﻬﺎ ﻓﻲ اﻟﻨﺺ ‪ ،‬ﻣﺜﺎل‪:‬‬

‫)" ‪println("hello ,we learn \"Kotlin\" programming‬‬

‫‪ v‬اﻟﺮ ﻣ ﺰ ‪\ $‬‬

‫ﻣﺨﺼﺺ ﻟﻄﺒﺎﻋﺔ ﻋﻼﻣﺔ ‪ $‬ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺘﻬﺎ ﻓﻲ اﻟﻨﺺ ‪ ،‬ﻣﺜﺎل‪:‬‬

‫)" ‪println("Dollar \$ is the currency for United State‬‬

‫‪ v‬اﻟﺮ ﻣ ﺰ \ \‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪57‬‬


‫ﻣﺨﺼﺺ ﻟﻄﺒﺎﻋﺔ ﻋﻼﻣﺔ \ ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺘﻬﺎ ﻓﻲ اﻟﻨﺺ ‪ ،‬ﻣﺜﺎل‪:‬‬

‫)"‪println("hello \\ welcome‬‬

‫‪UNICODE‬‬

‫ﺗﺘﻨﻮع اﻟﺮﻣﻮز واﻟﺤﺮوف اﻟﻤﺴـﺘﺨﺪﻣﺔ ﻣﻦ ﺑﻠﺪ ﻷﺧﺮ واﻟﻴﻮﻧﻴﻜﻮد ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺷـﻔﺮة ﺧﺎﺻـﺔ‬
‫ﻟﺤﺮوف ورﻣﻮز ﻣﺨﺼﺼﺔ ﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ ﻓﻲ اﻟﺼﻮرة اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪58‬‬


‫ﻫﺬه اﻟﺮﻣﻮز اﻟﻤﺨﺼـﺼـﺔ ﻳﻤﻜﻨﻚ اﻟﻮﺻـﻮل إﻟﻴﻬﺎ ﻣﻦ ﺧﻼل اﻟﻤﻮﻗﻊ‪ UNICODE‬وﻟﺠﻠﺐ ال‬
‫‪Unicode‬اﻟﺨﺎص ﺑﻬﺎ ﻧﻘﻮم ﺑﺎﻟﺘﺎﻟﻲ‪:‬‬

‫ﺑﻤﺠﺮد اﻟﻮﻗﻮف ﻋﻠﻰ اﻟﺮﻣﺰ واﻟﻀﻐﻂ ﻇﻬﺮ ﻟﻨﺎ ﻣﺮ ﺑﻊ اﺧﺘﺼﺎر ﻓﻴﻪ اﻟﻤﻌﻠﻮﻣﺎت اﻟﺘﻲ ﻧﺤﺘﺎﺟﻬﺎ‬
‫وﻧﻼﺣﻆ رﻣﺰ ‪ Unicode‬ﻇﻬﺮ ﻟﻨﺎ‪.‬‬

‫ﻟﻜﺘﺎﺑﺔ اﻟﺮﻣﺰ ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ واﻻﺳﺘﻔﺎدة ﻣﻨﻪ ﻧﻜﺘﺐ ﻫﻜﺬا\‪:u2101‬‬

‫ﻻﺑﺪ ﻣﻦ رﻣﺰ ‪ \u‬ﻓﻲ اﻟﺒﺪا ﻳﺔ وﻣﻦ ﺛﻢ اﻟﺮﻗﻢ اﻟﺨﺎص ﺑﺎﻟﺮﻣﺰ‪ ،‬ﻣﺜﺎل‪:‬‬

‫{)>‪fun main(args:Array<String‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪59‬‬


var c='\u2101'
println(c)
}

:‫وﻫﻨﺎ ﻗﻤﻨﺎ ﺑﻌﻤﻠﻴﺔ ﻃﺒﺎﻋﺔ ﻟﻠﺮﻣﻮز اﻟﻮاﻗﻌﺔ ﺑﻴﻦ ﻣﺪى ﻣﻌﻴﻦ‬

fun main(args:Array<String>){
var e1='\u0200'
var e2='\u0218'

for ( i in '\u0200' .. '\u0218')


{
println(i)
}

: ‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
Ȁ
ȁ
Ȃ
ȃ
Ȅ
ȅ
Ȇ
ȇ
Ȉ
ȉ

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 60 ‫اﻟﺼﻔﺤﺔ‬


Ȋ
ȋ
Ȍ
ȍ
Ȏ
ȏ
Ȑ
ȑ
Ȓ
ȓ
Ȕ
ȕ
Ȗ
ȗ
Ș

:‫ اﻟﺨﺎص ﺑﺤﺮف أو رﻣﺰ ﻣﻌﻴﻦ‬Unicode ‫ ﻟﺠﻠﺐ‬v

:‫ ﻣﺜﺎل‬،‫ اﻟﺨﺎص ﺑﻪ‬Unicode ‫ﻟﻮ أردت ﻛﻤﺴﺘﺨﺪم أن ﺗﻘﻮم ﺑﺈدﺧﺎل ﺣﺮف ﻣﻌﻴﻦ ﻟﻤﻌﺮﻓﺔ‬

fun main(args:Array<String>){
println("enter any character :")
var ch:Char = readLine()!!.single()
println("unicode of this character is : ${ch.toInt()}")
}

var ch:Char = readLine()!!.single()

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 61 ‫اﻟﺼﻔﺤﺔ‬


‫ إذا ﻟﺘﺤﻮﻳﻞ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ‬،toChar ‫اﻟﺤﺮف ﻫﻮ اﻟﻮﺣﻴﺪ اﻟﺬي ﻻ ﺗﺴـ ـــــ ـﺘﻄﻴﻊ ﻛﺘﺎﺑﺘﻪ ﻫﻜﺬا‬
.single ‫إﻟﻰ ﺣﺮف ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام‬

${toInt()}

.Unicode ‫ﻋﻦ ﻃﺮ ﻳﻖ ﻫﺬا اﻷﻣﺮ ﺳﻴﻈﻬﺮ ﻟﻨﺎ‬

Unicode ‫ ﻟﺠﻠﺐ اﻟﺤﺮف أو رﻣﺰ ﻣﻌﻴﻦ ﻋﻦ ﻃﺮﻳﻖ إدﺧﺎل‬v

fun main(args:Array<String>){

println("enter the unicode :")


var uniNum:Int= readLine()!!.toInt()
println("unicode of this character is : ${uniNum.toChar()}")

REGEX (Regular Expression)

‫ اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳﻴﺔ‬: ‫أوﻻ‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 62 ‫اﻟﺼﻔﺤﺔ‬


‫اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳـﻴﺔ ﻣﻔﻴﺪة ﺑﺸـﻜﻞ ﻛﺒﻴﺮ ﺧﺼـﻮﺻـﺎ ﻟﻮ أردت أن ﻳﺪﺧﻞ اﻟﻤﺴـﺘﺨﺪم ﺑﻴﺎﻧﺎت‬
‫وﻟﻜﻦ ﺑﻘﻴﻮد ﻣﻌﻴﻨـﺔ ‪ ،‬ﻣﺜﻼ اﻟﺒﺮ ﻳـﺪ اﻹﻟﻜﺘﺮوﻧﻲ ﺗﺮ ﻳـﺪه أن ﻳﻘﻮم ﺑـﺈدﺧـﺎﻟـﻪ ﺑﺼـ ــــــ ـﻴﻐﺘـﻪ اﻟﺼـ ــــــ ـﺤﻴﺤـﺔ‬
‫ﻛﺎﻟﺘﺎﻟﻲ ‪:‬‬

‫‪Ahmed1431@gmail.com‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬ﻃﺮﻳﻘﺔ اﻟﺘﻌﺒﻴﺮ ﻋﻦ اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳﻴﺔ‬

‫ﻻﺑﺪ ﻣﻦ اﻟﺘﻌﺮف ﻋﻠﻰ اﻟﺮﻣﻮز اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﻠﺘﻌﺒﻴﺮ ﻋﻦ اﻟﺮﻣﻮز اﻟﻘﻴﺎﺳﻴﺔ‪:‬‬

‫§ \‪d‬‬

‫ﻣﺨﺼـ ــــــ ـﺺ ﻹدﺧـﺎل رﻗﻢ ﻣﻦ ‪ ٩-٠‬ﻓﻘﻂ أي ﻟﻮ ﻗﻤـﺖ ﺑـﺈدﺧـﺎل أي ﺣﺮف او رﻣﺰ ﺳـ ــــــ ـﺘﻜﻮن‬
‫اﻟﻨﺘﻴﺠﺔ ‪.false‬‬

‫§ \‪w‬‬

‫ﻹدﺧﺎل أي ﻣﻦ اﻟﻘﻴﻢ اﻟﺘﺎﻟﻴﺔ ‪ : a-z ,A-Z ,0-9‬اﻟﺤﺮوف ﺳـﻮاء ﻛﺎﻧﺖ ﻛﺒﻴﺮة أو ﺻـﻐﻴﺮة وأي‬
‫رﻗﻢ ﻣﻦ ‪.٩-٠‬‬

‫§ \‪s‬‬

‫ﻟﻄﺒﺎﻋﺔ ﻣﺴﺎﻓﺔ‪.‬‬

‫§ ][‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪63‬‬


‫ﻟﻠﺘﻨﺴـ ـﻴﻖ ﺑﻤﻌﻨﻰ ﻟﻮ أردت أن ﺗﻄﻠﺐ ﻣﻦ اﻟﻤﺴـ ـﺘﺨﺪم إدﺧﺎل ﺣﺮوف ﻣﻦ ‪ a-z‬وﻧﻼﺣﻆ أﻧﻨﺎ‬
‫ﻃﻠﺒﻨﺎ ﺣﺮوف ﺻﻐﻴﺮة ﻧﻘﻮم ﺑﻮﺿﻌﻬﺎ ﺑﻴﻦ ﻫﺬه اﻷﻗﻮاس اﻟﻤﺮ ﺑﻌﺔ ﻫﻜﺬا]‪: [a-z‬‬

‫§ }{‬

‫ﻧﺴﺘﺨﺪﻣﻬﺎ ﻟﺘﺤﺪﻳﺪ ﻋﺪد اﻟﺨﺎﻧﺎت اﻟﻤﺪﺧﻠﺔ ﻓﻤﺜﻼ ﺑﻌﺪ ﻃﻠﺒﻚ ﻣﻦ اﻟﻤﺴﺘﺨﺪم ادﺧﺎل اﺳﻤﻪ‬
‫ﺳـ ــــ ـﻨﻘﻮم ﺑﺘﺤﺪﻳﺪ ﻋﺪد اﻟﺤﺮوف اﻟﻤﺪﺧﻠﺔ ﺑﺤﻴﺚ أن اﺳـ ــــ ـﻤﻪ ﻻ ﻳﺘﺠﺎوز ‪ ٢٠‬ﺣﺮف وﻻ ﻳﻘﻞ ﻋﻦ ‪٥‬‬
‫ﻣﺜﻼ ﻫﻜﺬا‪:‬‬

‫}‪[a-z]{5,20‬‬

‫§ \*‬

‫ﻟﻮ أردت أن ﻳﻘﻮم اﻟﻤﺴـ ــــ ـﺘﺨﺪم ﺑﺈدﺧﺎل ﺧﺎﻧﺎت ﻛﺜﻴﺮة وﻓﻲ ﺣﺎل أ ﻳﻀـ ــــ ـﺎ ﺗﺮﻛﺖ ﻟﻪ ﺧﻴﺎر ﺑﺄن ﻻ‬
‫ﻳﻘﻮم ﺑﺎﻹدﺧﺎل أ ﻳﻀﺎ‪ .‬ﻣﺜﻼ‪:‬‬

‫*‪\w‬‬

‫§ \‪+‬‬

‫ﻟﻮ أردت أن ﻳﻘﻮم اﻟﻤﺴـ ــــــ ـﺘﺨـﺪم ﺑـﺈدﺧـﺎل ﺧـﺎﻧـﺎت ﻛﺜﻴﺮة أو ﻋﻠﻰ اﻷﻗـﻞ ﻻﺑـﺪ ﻣﻦ إدﺧـﺎل ﺧـﺎﻧـﺔ‬
‫ﺨﺎـﻧﺎت ﻛﺜﻴﺮة أو ﻋﻠﻰ اﻷـﻗﻞ‬
‫ﻤﻞء اﻟﻔﺮاغ ﺑ ـ‬
‫ﺠﺎل ﻟﺘﺮـﻛﻪ ـﻓﺎﺿـ ــــــ ـﻲ إـﻣﺎ إن ﺗﻘﻮم ﺑ ـ‬
‫ﺣﺪة ﺑﻤﻌﻨﻰ ﻻ ﻣ ـ‬
‫وا ـ‬
‫أدﺧﻞ ﺧﺎﻧﺔ‪ .‬ﻣﺜﻼ‪:‬‬

‫‪\w+‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪64‬‬


‫§ \?‬

‫ﻳﺪع اﻟﻤﺠﺎل ﻟﻠﻤﺴﺘﺨﺪم إﻣﺎ أن ﻻ ﻳﺪﺧﻞ أﺑﺪا أو ﻳﺪﺧﻞ ﺧﺎﻧﺔ واﺣﺪة ﻓﻘﻂ ‪ ،‬ﻣﺜﻼ‪:‬‬

‫?‪\w‬‬

‫§ )(‬

‫ﻟﺘﺠﻤﻴﻊ اﻟﺘﻨﺴﻴﻖ اﻟﺬي ﺗﺨﻄﻂ ﻟﻪ ‪ ،‬ﻣﺜﻼ‪:‬‬

‫)"}‪("\\d{4‬‬

‫ﻧﻼﺣﻆ أﻧﻨﺎ وﺿﻌﻨﺎ ﻗﻮﺳﻴﻦ داﺋﺮ ﻳﻴﻦ وﻣﻦ ﺛﻢ ﻋﻼﻣﺔ اﻟﺘﻨﺼﻴﺺ‪.‬‬

‫§ |‬

‫ﻟﻨﻔﺮض أﻧﻚ ﻃﻠﺒﺖ ﻣﻦ اﻟﻤﺴـ ــ ـﺘﺨﺪم إدﺧﺎل ﺑﻴﺎن ﻣﻌﻴﻦ وﻳﺤﺘﻤﻞ إدﺧﺎﻟﻪ أ ﻛﺜﺮ ﻣﻦ ﺷـ ــ ـﻜﻞ‬
‫)ﺗﻨﺴـ ــــــ ـﻴﻖ( ﻓﻨﺴـ ــــــ ـﺘﺨـﺪم ﻫـﺬه اﻟﻌﻼﻣـﺔ ﻟﻠﺘﺨﻴﻴﺮ ﺑﻤﻌﻨﻰ ﻟﻮ أدﺧـﻞ اﻟﺘﻨﺴـ ــــــ ـﻴﻖ اﻟـﺬي ﻋﺮﻓﻨـﺎه أو‬
‫اﻟﺘﻨﺴﻴﻖ اﻷﺧﺮ ﻓﻬﻮ ﺻﺤﻴﺢ‪ ،‬ﻣﺜﻼ‪:‬‬

‫ﺧﺎـﻟﻪ ﺑﻄﺮ ﻳﻘﺘﻴﻦ إـﻣﺎ‬


‫ﺧﺎل رﻗﻢ اﻟـﻬﺎﺗﻒ اﻟﻨـﻘﺎل ـﻓﺄـﻧﺖ ﺗﺘﻮﻗﻊ إد ـ‬
‫ﺨﺪم إد ـ‬
‫ﻟﻮ ﻃﻠـﺒﺖ ﻣﻦ اﻟﻤﺴـ ــــــ ـﺘ ـ‬
‫أن ﻳﻘﻮم ﺑـﺈدﺧـﺎل ‪ ١٠‬ارﻗـﺎم ﻛﻤـﺎ ﻫﻮ ﻣﻌﺘـﺎد أو إﻣـﺎ ﻋﻦ ﻃﺮ ﻳﻖ وﺿـ ــــــ ـﻊ ﻣﻔﺘـﺎح اﻟـﺪوﻟـﺔ وﻣﻦ ﺛﻢ ‪٩‬‬
‫ارﻗﺎم ﻫﻜﺬا‪:‬‬

‫)"}‪var exp = Regex("\\d{10‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪65‬‬


‫)"}‪var exp1 = Regex("\\+966\\d{9‬‬

‫وﻋﻨﺪ اﻻﺧﺘﻴﺎر ﺳﻨﻘﻮم ﻫﻜﺬا‪:‬‬

‫‪exp |exp1‬‬

‫§ ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﺮﻣﻮز ﻛـ )& ‪ ، * ،‬؟ ‪… ، . ، !، @ ، # ،‬إﻟﺦ(‬


‫?\‬
‫‪\$‬‬
‫&\‬
‫*\‬

‫§ ‪. Dout‬‬

‫ﺗﺴﺘﺨﺪم ﻟﻠﺘﺠﺎﻫﻞ ﻓﻤﺜﻼ ﺗﺮ ﻳﺪ ﺗﺠﺎﻫﻞ ﺧﺎﻧﺔ أو أ ﻛﺜﺮ ﻓﻲ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ‪ ،‬ﻣﺜﻼ‪:‬‬

‫}‪\\d..\\d{4‬‬

‫ﻧﻼﺣﻆ ﻃﻠﺒﻨـﺎ أﻧـﻪ ﻳـﺪﺧـﻞ ﻓﻲ اﻟﺒـﺪا ﻳـﺔ رﻗﻢ ﺛﻢ ‪ .‬ﻟﺘﺠـﺎﻫـﻞ ﺧـﺎﻧـﺔ و ‪ .‬ﻣﺮة أﺧﺮى ﻟﺘﺠـﺎﻫـﻞ ﺧـﺎﻧـﺔ‬
‫ﺛﺎﻧﻴﺔ وﻣﻦ ﺛﻢ رﻗﻢ‪.‬‬

‫ﺛﺎﻟﺜﺎ‪ :‬ﻣﺜﺎل‪:‬‬

‫{)>‪fun main(args:Array<String‬‬

‫)"‪println("Hello , please complete this form :\n Enter your name :‬‬
‫)"}‪val nameEx = Regex("\\w{3,10}\\s\\w{3,15‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪66‬‬


val name = readLine()!!.toString()
if(nameEx.matches(name)){
println(" Enter your phone number :")
val phoneEx = Regex("\\+966\\d{9}")
val phone = readLine()!!.toString()
if(phoneEx.matches(phone)){
println(" Enter your Email :")
val emailEx = Regex("(^[a-zA-Z0-9_.+-]{2,25}+@[a-zA-Z0-9-
]{5,12}+\\.[a-zA-Z0-9-.]{2,3})")
val email = readLine()!!.toString()
if(emailEx.matches(email)){
println("thank you")
}
else {
println("please enter correct email")
}
}
else {
println("please enter correct phone name begining with +966
")
}
}
else {
println("please enter correct name")
}
}

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
Hello , please complete this form :
Enter your name :

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 67 ‫اﻟﺼﻔﺤﺔ‬


ahmed aljuaid
Enter your phone number :
+966123456789
Enter your Email :
ahmed12.ahmed@gmail.com
thank you

‫ اﻟﺪوال اﻟﻤﺴﺘﺨﺪﻣﺔ ﻣﻊ اﻟﺘﻌﺒﻴﺮات اﻟﻘﻴﺎﺳﻴﺔ‬: ‫راﺑﻌﺎ‬

Find v

.[matchedResult – null] ‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة‬

‫ﺗﺘﺤﻘﻖ ﻫﺬه اﻟﺪاﻟﺔ ﻣﻦ ﺗﻄﺎﺑﻖ اﻟﻨﺺ اﻟﻤﺪﺧﻞ ﻣﻊ اﻟﺘﻨﺴـ ـــــ ـﻴﻖ اﻟﻤﺨﺼـ ـــــ ـﺺ ﻟﻪ ﻃﺎﻟﻤﺎ ﻛﺎن‬
.null ‫ وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑـ‬،‫ﻣﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑﺎﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ‬

‫§ ﻣﺜﺎل‬
println("enter your phone number:")
var phone = readLine()!!.toString()

val phoneEx :String? = Regex("\\+966\\d{9}") // like : +966561234567


.find(phone)?.value
println(phoneEx)

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 68 ‫اﻟﺼﻔﺤﺔ‬


‫ادﺧﻠﻨﺎ ﻗﻴﻤﺔ ﻏﻴﺮ ﻣﻄﺎﺑﻘﺔ ﻟﻠﺘﻨﺴﻴﻖ ﻓﻨﻼﺣﻆ اﻧﻪ ﺳﻴﻄﺒﻊ ‪.null‬‬

‫‪findAll v‬‬

‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة ‪ :‬ﺗﻌﻮد ﺑﺠﻤﻴﻊ اﻟﻘﻴﻢ اﻟﻤﺘﻄﺎﺑﻘﺔ ﻣﻊ اﻟﺘﻨﺴﻴﻖ اﻟﻤﻄﻠﻮب‪ .‬ﻣﺜﻼ‪:‬‬

‫= ‪val matchedResults = Regex(pattern = """\d+""").findAll(input‬‬


‫)"‪"1as232v4‬‬

‫{ )‪for (i in matchedResults‬‬
‫)" " ‪print(i.value +‬‬
‫}‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬

‫اﻟﺘﻨﺴـ ـــ ـﻴﻖ اﻟﻤﻄﻠﻮب ﻓﻲ اﻟﻤﺜﺎل ﻫﻮ رﻗﻢ ﻓﻘﻂ ﻓﻨﻘﻮم ﺑﻌﻤﻞ ﺣﻠﻘﺔ ﺗﻌﻮد ﺑﺎﻷرﻗﺎم اﻟﻤﻮﺟﻮدة‬
‫ﻓﻲ اﻟﻨﺺ ﻣﻊ ﻃﺒﺎﻋﺔ ﻣﺴﺎﻓﺔ‪:‬‬

‫‪1 232 4‬‬

‫ﻧﻼﺣﻆ أﻧﻪ ﻃﺒﻊ رﻗﻢ ‪ ١‬وﻣﻦ ﺛﻢ ﻣﺴـ ـــﺎﻓﺔ وﻣﻦ ﺛﻢ ﻃﺒﻊ اﻷرﻗﺎم ‪ ٢٣٢‬ﻣﺘﺘﺎﻟﻴﺔ ﺑﺪون ﻣﺴـ ـــﺎﺣﺔ‬
‫ﻷﻧﻬﺎ ﻓﻲ اﻟﻨﺺ أﺗﺖ ﻣﻊ ﺑﻌﻀـ ـــ ـﻬﺎ ﻟﻢ ﻳﻔﺼـ ـــ ـﻠﻬﺎ ﺣﺮف أو رﻣﺰ وﻣﻦ ﺛﻢ ﻣﺴـ ـــ ـﺎﺣﺔ وﻫﻜﺬا ﻳﺴـ ـــ ـﺘﻤﺮ‬
‫ﻋﻤﻠﻬﺎ‪.‬‬

‫‪matchEntire v‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪69‬‬


‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة‪.[matchedResult – null] :‬‬

‫ﻟﻠﺘﺤﻘﻖ ﻣﻦ اﻟﻘﻴﻤـﺔ اﻟﻤـﺪﺧﻠـﺔ ﻋﻨـﺪ اﻟﺘﻄـﺎﺑﻖ ﻣﻊ اﻟﺘﻨﺴـ ــــــ ـﻴﻖ اﻟﻤﺨﺼـ ــــــ ـﺺ ﻟـﻪ ﻃـﺎﻟﻤـﺎ ﻛـﺎن‬
‫ﻣﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑﺎﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ ‪ ،‬وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑ ـ ـــــــ ـ ‪ ،null‬ﻣﻊ اﻟﺘﻨﻮﻳﻪ أن اﻟﻤﺴـﺎﻓﺔ‬
‫ﺗﺤﺘﺴﺐ ﻛﺤﺮف ﻓﻌﻨﺪ إٍذ ﺗﻌﻮد ﺑـ ‪ null‬ﻟﻮ ﻛﺎن اﻟﺘﻨﺴﻴﻖ اﻟﻤﻄﻠﻮب رﻗﻢ ﻓﻘﻂ‪.‬‬

‫)"‪println("enter your age:‬‬

‫‪val age= Regex("\\d+").matchEntire("25")?.value‬‬

‫)‪println(age‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬

‫ﻋﻨﺪ اﻟﺘﻄﺎﺑﻖ ﻃﺒﻊ اﻟﻌﻤﺮ وﻋﻨﺪ اﻻﺧﺘﻼف ﻳﻌﻮد‪null .‬‬

‫‪enter your age:‬‬


‫‪25‬‬

‫‪matches v‬‬

‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة‪.[true – false] :‬‬

‫ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺗﻄـﺎﺑﻖ اﻟﻘﻴﻤـﺔ اﻟﻤـﺪﺧﻠـﺔ ﻛـﺎﻣﻠـﺔ ﻣﻊ اﻟﺘﻨﺴـ ــــــ ـﻴﻖ اﻟﻤﺨﺼـ ــــــ ـﺺ ﻟـﻪ ﻃـﺎﻟﻤـﺎ ﻛـﺎن‬
‫ﻣﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑـ ‪ ، true‬وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑـ ‪.false‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪70‬‬


‫§ ﻣﺜﺎل‬
‫)"""‪val regex = Regex(pattern = """\d+‬‬
‫))"‪println(regex.matches(input = "50 dollars‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪false‬‬

‫‪containsMatchIn v‬‬

‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة‪.[true – false] :‬‬

‫إذا ﻛﺎن ﺟﺰء ﻣﻦ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ ﻣﺘﻄﺎﺑﻘﺔ ﻣﻊ اﻟﺘﻨﺴ ـﻴﻖ اﻟﻤﺨﺼ ـﺺ ﻟﻪ ﻳﻌﻮد ﺑ ـ ــــــــ ـ ‪،true‬‬
‫وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑ ـ ــــــــــ ـ ‪ ،false‬وﻫﻲ ﻋﻜﺲ اﻟﺪاﻟﺔ ‪ matchEntire‬اﻟﺘﻲ ﺗﻌﺪ أن اﻟﻘﻴﻤﺔ‬
‫ﻏﻴﺮ ﻣﺘﻄﺎﺑﻘﺔ‪.‬‬

‫§ ﻣﺜﺎل‬
‫)"‪var age =Regex("""\d+""").containsMatchIn("25 years‬‬
‫)‪println(age‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪true‬‬

‫ﻧﻼﺣﻆ أﻧﻪ ﻋﺎد ﺑـ ‪ true‬وذﻟﻚ ﻷن اﻟﻮﻇﻴﻔﺔ اﻟﺮﺋﻴﺴﻴﺔ ﻟﻴﺴﺖ ﺗﻄﺎﺑﻖ ﺟﻤﻴﻊ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ‬
‫إﻧﻤﺎ ﻳﺘﺤﻘﻖ ﻫﻞ أدﺧﻠﺖ رﻗﻢ ﻛﻤﺎ ﻫﻮ ﻣﻄﻠﻮب ﻓﻲ اﻟﺘﻨﺴﻴﻖ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪71‬‬


‫‪split v‬‬

‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة ‪ :‬ﺗﻌﻴﺪ ﻟﻨﺎ ﻗﺎﺋﻤﺔ ﺗﺨﻠﻮ ﻣﻦ اﻟﺘﻨﺴﻴﻖ اﻟﺬي أﻧﺖ ﺣﺪدﺗﻪ‪ .‬ﻣﺜﺎل‪:‬‬

‫)"‪println("enter your age:‬‬


‫)(‪var testSplit = readLine()!!.toString‬‬
‫)‪val a = Regex("[a-zA-Z]").split(testSplit‬‬
‫)‪println(a‬‬

‫ﻃﻠﺒﻨـﺎ ﻣﻨـﻪ أن ﻳﻌﻮد ﺑﺠﻤﻴﻊ ﻣـﺎ ﺗﻘﻮم ﺑـﺈدﺧـﺎﻟـﻪ ﺑـﺎﺳـ ــــــ ـﺘﺜﻨـﺎء )”]‪ Regex(“[a-zA-Z‬ﺟﻤﻴﻊ‬
‫اﻟﺤﺮوف ﻻ ﺗﻌﻮد‪.‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪enter your age:‬‬
‫‪28‬‬
‫]‪[28‬‬

‫‪replace v‬‬

‫ﺳﺘﺒﺪال ﻣﺎ ﺗﻢ ﺗﺤﺪﻳﺪه ﻓﻲ اﻟﺘﻨ ـ‬


‫ﺴﻴﻖ ﻣﻦ ﺣﺮف او رﻗﻢ‬ ‫ﺼﻴﺔ ﻣﻊ ا ـ‬
‫اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة‪ :‬اﻟﻘﻴﻤﺔ اﻟﻨ ـ‬
‫او رﻣﺰ ﺑﻘﻴﻤﺔ أﺧﺮى‪ .‬ﻣﺜﺎل‪:‬‬

‫)"‪val testReplace = Regex("""\d+""").replace("ab12cd34ef", "x‬‬


‫)‪println(testReplace‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪72‬‬


‫ﻧـ ــ ـﻼﺣـ ــ ـﻆ أن )”””‪ Regex(“””\d+‬ﺣـ ــ ـﺪدﻧـ ــ ـﺎ أﻧـ ــ ـﻨـ ــ ـﺎ ﻧـ ــ ـﺮ ﻳـ ــ ـﺪ اﺳـ ــــــــــ ـﺘـ ــ ـﺒـ ــ ـﺪال ﻛـ ــ ـﻞ رﻗـ ــ ـﻢ ﻓـ ــ ـﻲ‬
‫اﻟﻨﺺ )”‪ replace(“ab12cd34ef”,“x‬ﺣـﺪدﻧـﺎ وﻣﻦ ﺛﻢ ﺣـﺪدﻧـﺎ اﻟﺤﺮف اﻟ ـﺬي ﻧﺮ ﻳـﺪه أن ﻳﺤـﻞ‬
‫ﻣﻜﺎن اﻟﺮﻗﻢ اﻟﺬي ﻧﺮ ﻳﺪ ﺗﺒﺪﻳﻠﻪ‪.‬‬

‫إذا ﺗﻘﻮم ﺑﺎﺳﺘﺒﺪال ﻗﻴﻤﺔ ﻣﻌﻴﻨﺔ ﻓﻲ اﻟﻨﺺ ﺑﻘﻴﻤﺔ أﺧﺮى ﻋﻦ ﻃﺮ ﻳﻖ ﺗﺤﺪﻳﺪﻫﺎ ﻓﻲ اﻟﺘﻨﺴﻴﻖ‪.‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪abxcdxef‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪73‬‬


‫ﺑﻨﻰ اﻟﺘﺤﻜﻢ‬

‫‪For Loop‬‬

‫ﻓﻠﻨﻔﺘﺮض أﻧﻨـﺎ أردﻧـﺎ ﻛﺘـﺎﺑـﺔ ﺟﻤﻴﻊ اﻷرﻗـﺎم اﻟﻮاﻗﻌـﺔ ﻣﻦ ‪ ١٠-١‬ﻓﻲ ﺑﺮﻧـﺎﻣﺠﻨـﺎ‪ ،‬ﻫـﻞ ﻫـﺬا ﻣﻤﻜﻦ؟‬
‫ﻧﻌﻢ‪ ،‬ﻣﻤﻜﻦ ﺣﺴـ ــــــ ـﻨـﺎ ً وﻟﻮ اردﻧـﺎ ﻛﺘـﺎﺑـﺔ اﻷرﻗـﺎم ﻣﻦ ‪ ،٢٠ -١‬ﻫـﻞ ﻫـﺬا ﻣﻤﻜﻦ؟ ﺳـ ــــــ ـﻮف ﻧﻘﻮل ﻧﻌﻢ‬
‫وﻟﻜﻦ ﻟﻨﻔﻜﺮ ﻗﻠﻴﻼ ً ﺑﺄرﻗﺎم ا ﻛﺒﺮ ﻣﺜﻼ ً ﻣﻦ ‪ ١٠٠ – ١‬ﺳـ ــــ ـﻮف ﺗﺠﺎوب وﺑﺴـ ــــ ـﺮﻋﺔ إﻧﻪ أﻣﺮ ﻣﺮﻫﻖ أن‬
‫ا ﻛﺘﺐ ﻛﻞ اﻷﻋﺪاد ﺑﺪاﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ‪ ،‬ﺣﺴـ ـــــ ـﻨﺎ ً ﻣﺜﺎل أﺧﺮ ﻟﻮ وﺿـ ـــــ ـﻌﺖ ﺷـ ـــــ ـﺮط أردﻧﺎ ﺗﻜﺮار ﻇﻬﻮر‬
‫رﺳـ ــ ـﺎﻟﺔ ﻣﻌﻴﻨﺔ ﻣﺎدام ﻫﺬا اﻟﺸـ ــ ـﺮط ﺻـ ــ ـﺤﻴﺢ‪ ،‬ﻫﻨﺎ ﺗﻈﻬﺮ ﻓﺎﺋﺪة ﺣﻠﻘﺎت اﻟﺘﻜﺮار اﻟﺘﻲ ﺗﻘﻮم ﺑﺘﻜﺮار‬
‫ﻤﺎ ﻓﻲ ﻣـﺜﺎل اﻷرـﻗﺎم اـﻟﺬي ذﻛﺮـﻧﺎه أردـﻧﺎ ﻃـﺒﺎ ـ‬
‫ﻋﺔ‬ ‫ﻌﺖ ـﻟﻪ ﺷـ ــــــ ـﺮط أو ﻛ ـ‬ ‫اﻷﻣﺮ اﻟﺒﺮﻣﺠﻲ ﻓﻲ ـ‬
‫ﺣﺎل وﺿـ ــــــ ـ ـ‬
‫ﻣﺠﻤﻮﻋﺔ اﻷرﻗﺎم‪.‬‬

‫أﻧﻮاع اﻟﺤﻠﻘﺎت اﻟﺘﻜﺮار ﻳﺔ‪((for loop – while – do..while :‬‬

‫أوﻻ ‪ :‬اﻟﺠﻤﻠﺔ ‪for loop‬‬

‫ﻧﺴﺘﺨﺪﻣﻬﺎ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻟﺪي ﻋﺪد ﻣﻌﻠﻮم ﻟﻠﺘﻜﺮار اﻟﺬي أر ﻳﺪه‪.‬‬

‫اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪74‬‬


‫{ )‪for (item in collection‬‬
‫‪// body of loop‬‬
‫}‬

‫ﻫﻨ ـﺎ أردﻧ ـﺎ ﻃﺒ ـﺎﻋ ـﺔ اﻷﻋ ـﺪاد ﻣﻦ ‪ ١٠-١‬أي أن اﻟﻨﻄ ـﺎق ﻋﻨ ـﺪي ﻣﻌﻠﻮم ﻓﻘﻂ ‪ ١٠‬ارﻗ ـﺎم ار ﻳ ـﺪ‬
‫ﻃﺒـﺎﻋﺘﻬـﺎ ﻣﻊ ﻣﺮاﻋـﺎة ان اﻟﻨﻘﻄﺘﻴﻦ ﺑﻴﻦ اﻟﻌـﺪدﻳﻦ ﻣﻬﻤﻴﻦ ﻷﻧﻨـﺎ ﻧﺮ ﻳـﺪ اﻷﻋـﺪاد اﻟﺘﻲ ﺗﻘﻊ ﻓﻲ ﻫـﺬا‬
‫اﻟﻨﻄﺎق‪.‬‬

‫)‪for ( i in 1..10‬‬
‫{‬
‫)‪println(i‬‬
‫}‬

‫ﺳﻢ ﺣﺮف ﺣﺮف أي‬


‫ﺳﻤﻪ وﻣﻦ ﺛﻢ ﻧﺮ ﻳﺪ ﻃﺒﺎﻋﺔ ﻫﺬا اﻻ ـ‬
‫ﺴﺘﺨﺪم أن ﻳﺪﺧﻞ ا ـ‬
‫ﻫﻨﺎ ﻧﺮ ﻳﺪ ﻣﻦ اﻟﻤ ـ‬
‫ﻓﻲ ﻛﻞ ﺳﻄﺮ ﺣﺮف‬

‫)"‪println("please enter your name :‬‬


‫!!)(‪var name:String= readLine‬‬
‫)‪for(i in name‬‬
‫{‬
‫)‪println(i‬‬
‫}‬

‫وﻧﺴـﺘﻄﻴﻊ ﺗﻄﺒﻴﻖ ﻣﺎ ﺗﻌﻠﻤﻨﺎه ﻓﻲ درس اﻟﺴـﻼﺳـﻞ اﻟﻨﺼـﻴﺔ وﻫﻮ اﺳـﺘﺨﺪام اﻟﺪوال اﻟﺨﺎﺻـﺔ‬
‫ﺑﻬﺎ‪.‬‬

‫)"‪println("please enter your name :‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪75‬‬


‫!!)(‪var name:String= readLine‬‬
‫))(‪for(i in name.reversed‬‬
‫{‬
‫)‪println(i‬‬
‫}‬

‫ﺛﺎﻧﻴﺎ ‪ nested for :‬واﻟﻤﻘﺼﻮد ﻫﻨﺎ اﻟﺤﻠﻘﺎت اﻟﻤﺘﺪاﺧﻠﺔ‬

‫ﻣﺜﻼ ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺔ ﺟﺪول اﻟﻀ ـﺮب ﻣﻦ ‪ ٥-١‬ﺟﺪول ‪ ١‬وﺟﺪول ‪ ٢‬وﺟﺪول ‪ ٣‬وﻫﻜﺬا وﺻ ـﻮﻻ ً‬
‫ﻟ ـ ــــــــ ـ ‪ ، ٥‬وﻟﻜﻨﻨﺎ ﻻ ﻧﺮ ﻳﺪ ﻃﺒﺎﻋﺔ ﺟﺪول اﻟﻀ ـﺮب ﻛﺎﻣﻼ ﻣﻦ ‪ ١٠-١‬ﺳ ـﻮف ﻧﻜﺘﻔﻲ ﻣﻦ ‪، ٣-١‬ﺳ ـﻮف‬
‫ﻧﺴﺘﺨﺪم ﺣﻠﻘﺘﻴﻦ ﻣﺘﺪاﺧﻠﺘﻴﻦ ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل‪.‬‬

‫ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ‪ i‬ﻓﻲ اﻟﺤﻠﻘﺔ اﻷوﻟﻰ ﺗﻌﺒﺮ ﻋﻦ ﻋﺪد ﺟﺪاول اﻟﻀـ ـــ ـﺮب اﻟﺬي ﻧﺮ ﻳﺪﻫﺎ ﻓﻨﺤﻦ ﻧﺮ ﻳﺪ‬
‫ﻣﻦ ﺟـﺪول ‪ ١‬إﻟﻰ ﺟـﺪول ‪ ، ٥‬وﻣﻦ ﺛﻢ ﻗﻤﻨـﺎ ﺑﻔﺘﺢ اﻷﻗﻮاس اﻟﻤﺮ ﺑﻌـﺔ وﻛﺘﺒـﺎن ﺑـﺪاﺧﻠﻬـﺎ اﻟﺤﻠﻘـﺔ‬
‫اﻟﺜـﺎﻧﻴـﺔ وﻫﻲ ﻣـﺎ ﺗﻌﺮف ﺑـﺎﻟﻤﺘـﺪاﺧﻠـﺔ ﻷﻧﻬـﺎ دﺧﻠـﺖ ﻋﻠﻰ اﻷوﻟﻰ ‪ ،‬ﻗﻴﻤـﺔ اﻟﻤﺘﻐﻴﺮ ‪ x‬ﺗﻌﺒﺮ ﻋﻦ أﻧﻨـﺎ‬
‫ﻧﺮ ﻳﺪ ﺑﺪء اﻟﻀﺮب ﻣﻦ رﻗﻢ ‪ ١‬واﻟﺘﻮﻗﻒ ﻋﻨﺪ ‪ ٣‬ﻻ ﻧﺮ ﻳﺪ ﻃﺒﺎﻋﺔ اﻟﺠﺪول ﻛﺎﻣﻞ‪.‬‬

‫{)‪for(i in 1..5‬‬
‫{ )‪for(x in 1..3‬‬
‫)‪println("$i * $x = " +i*x‬‬
‫}‬
‫)"‪println("--------------‬‬
‫}‬

‫‪ v‬ﺑﺮﻧﺎﻣﺞ اﺧﺘﺒﺎر اﻟﺮﻗﻢ زوﺟﻲ ام ﻓﺮدي‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪76‬‬


for( i in 1..3) {
println("please enter number :")
var num: Int = readLine()!!.toInt()
if (num % 2 == 0)
{ println("number is even")}
else
{ println("number is odd")}
}

‫ ﻧﺎﺗﺞ اﻟﺘ ﻨ ﻔ ﻴ ﺬ‬v

please enter number:

number is even

please enter number:

21

number is odd

please enter number:

10

number is even

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 77 ‫اﻟﺼﻔﺤﺔ‬


‫‪while & do while‬‬

‫اﻟﺠﻤﻠﺔ ‪while‬‬

‫ﻳﺆدي اﻷﻣﺮ ‪ while‬اﻟﻰ ﺗﻨﻔﻴﺬ اﻟﺸـ ـــــ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣﺮارا ً وﺗﻜﺮاًر ﻃﺎﻟﻤﺎ ان اﻟﺸـ ـــــ ـﺮط ﻣﺘﺤﻘﻖ‬
‫ﺑـ‪True‬‬

‫)‪while( condition‬‬
‫{‬
‫‪statements‬‬
‫‪.‬‬
‫‪.‬‬
‫‪counter‬‬
‫}‬

‫ﻫﻨﺎ اﻓﺘﺮﺿـﻨﺎ ان اﻟﻤﺘﻐﻴﺮ ﻗﻴﻤﺘﻪ ‪ ٢‬وﻣﻦ ﺛﻢ ﻗﻠﻨﺎ ﻃﺎﻟﻤﺎ أن ‪ i‬اﻗﻞ ﻣﻦ ‪ ١٠‬ﻗﻢ ﺑﻄﺒﺎﻋﺔ ﻗﻴﻤﺔ ‪،‬‬
‫ﺣﺴﻨﺎ وﻟﻜﻦ ﻣﺎذا ﺗﻌﻨﻲ ‪ i++‬ﻫﺬا ﻳﻌﻨﻲ أﻧﻨﺎ ﻧﺮ ﻳﺪ ز ﻳﺎدة اﻟﻌﺪد وﻣﻦ ﺛﻢ ﻧﺨﺘﺒﺮه ﻣﺮة أﺧﺮى ﺣﺘﻰ‬
‫ﻳﺼـ ـــ ـﻞ إﻟﻰ ‪ ٩‬ﻳﻘﻮم ﺑﻄﺒﺎﻋﺘﻪ وﻣﻦ ﺛﻢ ﻳﺘﻮﻗﻒ اﻟﺒﺮﻧﺎﻣﺞ ﻟﻤﺎذا؟ ﻷن اﻟﺸـ ـــ ـﺮط ﻳﺮ ﻳﺪ ﻃﺒﺎﻋﺔ اﻻﻋﺪاد‬
‫اﻟﺘﻲ ﺗﻘﻞ ﻋﻦ ‪ ١٠‬ﻓﻌﻨﺪﻣﺎ ﻧﺼـﻞ ﻟﻠﻌﺸـﺮة ﻟﻦ ﻳﺘﺤﻘﻖ اﻟﺸـﺮط أي ﻳﺼـﺒﺢ ﻏﻴﺮ ﺻـﺤﻴﺢ وﻣﻦ ﺛﻢ‬
‫ﻳﺘﻮﻗﻒ ‪ ،‬ﻟﻮ اﻧﻨﺎ ﻗﻠﻨﺎ اﻟﺸـ ـﺮط ﻫﻜﺬا ‪ i<=10‬ﻫﻨﺎ ﺳـ ـﻮف ﻳﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ ‪ ١٠‬وﻣﻦ ﺛﻢ ﻳﺘﻮﻗﻒ‬
‫وذﻟﻚ ﻷن ﻋﻼﻣﺔ اﻟﻤﺴﺎواة ﻣﺘﻮاﺟﺪة أي ﻫﻞ اﻟﺮﻗﻢ اﻗﻞ‬

‫ﻣﻦ ‪ ١٠‬او ﻳﺴﺎوﻳﻬﺎ اذا ﻛﺎن ﻧﻌﻢ ﻓﺎﻟﺸﺮط ﺻﺤﻴﺢ وإذا اﻟﻌﻜﺲ ﻓﺘﻮﻗﻒ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪78‬‬


‫‪var i=2‬‬
‫)‪while(i<10‬‬
‫{‬
‫)‪println(i‬‬
‫‪i++‬‬
‫}‬

‫‪nested while‬‬

‫ﺳﻮف‬
‫ﺴﻰ ﻛﺘﺎﺑﺔ اﻟﻌﺪاد ‪ x++,y++‬وﻋﻨﺪﻣﺎ ﻻ ﻧﻜﺘﺒﻬﺎ ﻛﻠﻴﻬﺎ او اﺣﺪﻫﻤﺎ ـ‬
‫اﻟﻤﻬﻢ ﻫﻮ ان ﻻ ﻧﻨ ـ‬
‫ﻳﻘﻮم ﺑﻄﺒﺎﻋﺔ ﻟﻠﻤﺎ ﻻﻧﻬﺎﻳﺔ ﻻن اﻟﺮﻗﻢ ﻟﻦ ﻳﺘﻐﻴﺮ وﺳﻴﻀﻞ ﺻﺤﻴﺢ وﻫﻲ ﻣﺎ ﺗﺴﻤﻰ ﺑـ ‪infinitive‬‬
‫‪.loop‬‬

‫‪var x =1‬‬
‫‪var y =1‬‬
‫)‪while(x<=5‬‬
‫{‬
‫)‪while(y<=3‬‬
‫{‬
‫)‪println("$x*$y="+x*y‬‬
‫‪y++‬‬
‫}‬
‫‪x++‬‬
‫}‬

‫اﻟﺠﻤﻠﺔ ‪do…while‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪79‬‬


‫ﻓﻲ ﻫﺬه اﻟﺤﻠﻘﺔ اﻷﻣﺮ ﻣﺨﺘﻠﻒ ﻗﻠﻴﻼ ً ﻫﻮ أﻧﻪ ﺣﺘﻰ ﻟﻮ اﻟﺸـ ـــــ ـﺮط ﻏﻴﺮ ﻣﺘﺤﻘﻖ ﻓﺴـ ـــــ ـﻮف ﻳﻘﻮم‬
‫ﺑﺘﻨﻔﻴﺬ اﻷﻣﺮ ﻟﻤﺮة واﺣﺪة ‪ ،‬ﻣﺜﺎل ﺗﻮﺿﻴﺤﻲ ﻋﻠﻰ ذﻟﻚ‪.‬‬

‫ﻫﻨـﺎ ﻓﻲ اﻟﺒـﺪا ﻳـﺔ ﻋﺮﻓﻨـﺎ اﻟﻤﺘﻐﻴﺮ ‪ x‬وﻗﻴﻤﺘـﻪ ‪ ، ٥‬اﻟﺒﺮﻧـﺎﻣﺞ ﺳـ ــــــ ـﻮف ﻳـﺪﺧـﻞ إﻟﻰ ‪ do‬ﻓﻲ اﻟﺒـﺪا ﻳـﺔ‬
‫وﻳﻨﻔﺬ ﻣﺎ ﺑﺪاﺧﻠﻬﺎ وﻫﻲ ﻃﺒﺎﻋﺔ اﻟﻘﻴﻤﺔ وﻻ ﻧﻨﺴﻰ أ ﻳﻀﺎ ﻫﻨﺎ ﻛﺘﺎﺑﺔ اﻟﻌﺪاد اﻟﺬي ﻫﻮ اﻟﺰ ﻳﺎدة وﻣﻦ‬
‫ﺛﻢ ﻳﻘﻮم ﺑﺎﻟﺘﺤﻘﻖ ﻣﻦ اﻟﺸـ ـــ ـﺮط وﻫﻮ ﻗﻴﻤﺔ ‪ x‬ﺑﻌﺪ اﻟﺰ ﻳﺎدة ﻫﻞ ﻫﻲ ا ﻛﺒﺮ ﻣﻦ ‪ ١٠‬ام ﻻ واﻟﺸـ ـــ ـﺮط‬
‫ﻫﻨـﺎ ﻏﻴﺮ ﻣﺘﺤﻘﻖ ﻻن ‪ ٦‬اﺻـ ــــــ ـﻐﺮ ﻣﻦ ‪ ١٠‬ﻓﻴﺘﻮﻗﻒ اﻟﺒﺮﻧـﺎﻣﺞ وﺑـﺬﻟـﻚ ﻳﻜﻮن ﻓﻘﻂ اﻟﻘﺮاءة اﻷوﻟﻰ‬
‫ﻫﻲ اﻟﺘﻲ ﺗﺘﻨﻔﺬ ﺑﺪون اﻟﻨﻈﺮ إﻟﻰ اﻟﺸﺮط‪.‬‬

‫‪var x = 5‬‬
‫{‪do‬‬
‫)‪println(x‬‬
‫‪x++‬‬
‫}‬
‫)‪while(x>10‬‬

‫ﻫﻨﺎ ﻓﺘﺤﻨﺎ ‪ do‬وﻣﻦ ﺛﻢ ﻃﻠﺒﻨﺎ ﻣﻦ اﻟﻤﺴـﺘﺨﺪم ادﺧﺎل ﺳـﻠﺴـﻠﺔ ﻧﺼـﻴﺔ اﺳـﻤﻪ وﺳـﻮف ﻳﻘﻮم‬
‫ﺑﻄﺒﺎﻋﺘﻪ وﻣﻦ ﺛﻢ ﻳﻘﻮم ﺑﺎﻟﺪﺧﻮل إﻟﻰ ‪ while‬ﻟﻠﺘﺤﻘﻖ ﻣﻦ اﻟﺸـﺮط ﻓﻲ ﺣﺎل ان اﻟﻤﺴـﺘﺨﺪم ادﺧﻞ‬
‫اﺳـﻢ ﺣﺮوﻓﻪ ﺗﺘﺠﺎوز ‪ ١٠‬اﺣﺮف ﺳـﻮف ﺗﺘﻜﺮر ﻇﻬﻮر اﻟﺮﺳـﺎﻟﺔ ‪ ،‬وﻟﻜﻦ ﻟﻮ ادﺧﻞ اﺳـﻢ ﺣﺮوﻓﻪ اﻗﻞ‬
‫ﻣﻦ ‪ ١٠‬ﺳﻮف ﻳﺘﻮﻗﻒ اﻟﺒﺮﻧﺎﻣﺞ ﻷن اﻟﺸﺮط ﻟﻢ ﻳﺘﺤﻘﻖ‪.‬‬

‫{‪do‬‬
‫)"‪println("please enter your name :‬‬
‫!!)(‪var x:String= readLine‬‬
‫)‪println(x‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪80‬‬


}
while(x.length >10)

when

‫ ﻓﻲ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ ﺑﺤﻴﺚ اﻧﻬﺎ ا ﻛﺜﺮ‬switch-case ‫ ﻫﻲ اﻟﺠﺰء اﻟﻤﻄﻮر واﻟﺒﺪﻳﻞ ﻋﻦ‬when


ً ‫ﻀﺎ‬
‫ واﻟﺠﻤﻴﻞ ا ﻳ ـ‬. ‫ﺼﻴﺺ واﻟﺘﻌﺪﻳﻞ ﺑﺎﻛﺜﺮ ﻣﻦ ﻧﻮع ﻣﻦ اﻟﻤﺘﻐﻴﺮات‬
‫ﻣﺮوﻧﻪ وﻣﻨﻄﻘﻴﺔ وﻗﺎﺑﻠﺔ ﻟﻠﺘﺨ ـ‬
.‫ ﺑﺸﻜﻞ ﺳﺮ ﻳﻊ‬extension ‫او ﻛـ‬-statment ‫اﻧﺎ ﻳﻤﻜﻨﻨﺎ اﺳﺘﺨﺪاﻣﻬﺎ ﻛـ‬

‫ اﻟﺼ ﻴ ﻐ ﺔ اﻟﻌ ﺎﻣ ﺔ ﻟﻬ ﺎ ﺗﻜ ﻮ ن ﺑﻬ ﺬ ا اﻟﺸ ﻜ ﻞ‬v

var dayOfWeek = 4
when(dayOfWeek) {
1 -> println("Monday")
2 -> println("Tuesday")
3 -> println("Wednesday")
4 -> println("Thursday")
5 -> println("Friday")
6 -> println("Saturday")
7 -> println("Sunday")
else -> println("Invalid Day")
}
// Displays - "Thursday"

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 81 ‫اﻟﺼﻔﺤﺔ‬


‫ﻧﻼﺣﻆ اﻧﻨﺎ ﻗﻤﻨﺎ ا ﻳﻀـ ـــــ ـﺎ ً ﺑﺎﺳـ ـــــ ـﺘﺨﺪام ‪ else‬اذا ﻗﺎم اﻟﻤﺴـ ـــــ ـﺘﺨﺪم ﺑﺎدﺧﺎل رﻗﻢ ﺧﺎرج اﻟﺤﺪود‬
‫ﺳﻴﻄﺒﻊ ﻟﻪ ان اﻟﻴﻮم ﻏﻴﺮ ﺻﺤﻴﺢ‪.‬‬

‫‪ v‬اﻟﺪﻣﺞ ﺑﻴﻦ ا ﻛﺜﺮ ﻣﻦ ﻗﻴﻤﺔ او ﺷﺮط‬

‫اذا ﻛﺎن ﻟﺪﻳﻚ ا ﻛﺜﺮ ﻣﻦ ﺣﺎﻟﺔ وﺗﻮد اﺧﺘﺒﺎرﻫﺎ ﻓﻲ ‪ when‬واﺣﺪة ﺳﻴﺘﺤﺘﻢ ﻋﻠﻴﻚ وﺿﻊ ﻓﺎﺻﻠﺔ‬
‫ﺑﻴﻦ ﻛﻞ اﺣﺘﻤﺎل وآﺧﺮ ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ‪.‬‬

‫‪var dayOfWeek = 6‬‬


‫{ )‪when (dayOfWeek‬‬
‫)"‪1, 2, 3, 4, 5 -> println("Weekday‬‬
‫)"‪6, 7 -> println("Weekend‬‬
‫)"‪else -> println("Invalid Day‬‬
‫}‬
‫‪// Displays - Weekend‬‬

‫‪ v‬اﺳ ﺘ ﺨ ﺪ اﻣ ﻬ ﺎ ﻣ ﻊ اﻟﻨ ﻄ ﺎق‬

‫‪var dayOfMonth = 5‬‬


‫{ )‪when(dayOfMonth‬‬
‫! )"‪in 1..7 -> println("We're in the first Week of the Month‬‬
‫)"‪in 15..21 -> println("We're not in the third week of the Month‬‬
‫)"‪else -> println("none of the above‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪82‬‬


// Displays - We're in the first Week of the Month

is :‫ اﺳﺘﺨﺪاﻣﻬﺎ ﻛـ‬v

.‫ ﺑﺎﻟﺸﻜﻞ اﻟﺘﺎﻟﻲ‬when ‫ ﻣﻊ‬is ‫اذا اردت اﻟﺘﺤﻘﻖ ﻣﻦ ﻧﻮع اﻟﻤﺘﻐﻴﺮ ﻳﻤﻜﻨﻚ اﺳﺘﺨﺪام‬

var x : Any = 6.86


when(x) {
is Int -> println("$x is an Int")
is String -> println("$x is a String")
!is Double -> println("$x is not Double")
else -> println("none of the above")
}
// Displays - none of the above

if-else-if :‫ اﺳﺘﺨﺪاﻣﻬﺎ ﻛﺒﺪﻳﻞ ﻟـ‬v

‫ ﺳﺘﻜﻮن اﻓﻀﻞ وارﺗﺐ ﻟﻠﻜﻮد وأ ﻛﺜﺮ ﻣﻨﻄﻘﻴﺔ‬if-else-if ‫ ﻛﺒﺪﻳﻞ ﻟﻠ ـ ـ‬when ‫ﻳﻤﻜﻦ اﺳﺘﺨﺪام‬
.‫ﻋﻨﺪﻣﺎ ﺗﻜﻮن اﻻﺣﺘﻤﺎﻻت ﻛﺜﻴﺮة ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ‬

var number = 20
when {
number < 0 -> println("$number is less than zero")
number % 2 == 0 -> println("$number is even")
number > 100 -> println("$number is greater than 100")
else -> println("None of the above")
}

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 83 ‫اﻟﺼﻔﺤﺔ‬


‫‪// Displays - 20 is even‬‬

‫اﻟﺠﻤﻠﺔ اﻟﺸﺮﻃﻴﺔ‬

‫ﻛﻤـﺎ ﻧﻌﻠﻢ ﺟﻤﻴﻌﻨـﺎ أن اﻻﺣﺘﻤـﺎﻻت واﻟﻤﻘـﺎرﻧـﺎت أﻣﺮ وارد ﻓﻲ اﻟﺤﻴـﺎة ﻛﻤـﺎ أن اﺧﺘﺒـﺎر اﻷﺷـ ــــــ ـﻴـﺎء‬
‫ﻳﺠﻌﻠﻨﺎ ﻧﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺘﻬﺎ ﻛﻤﺜﺎل ﺑﺴـﻴﻂ ﻋﻨﺪﻣﺎ ﻳﻜﻮن ﻟﺪﻳﻚ ﻣﺎدة دراﺳـﻴﺔ ﻣﻌﺪل اﻟﻨﺠﺎح ﺑﻬﺎ‬
‫ﻌﺪل‬
‫ﻫﻞ ﻫﻲ ا ﻛﺒﺮ او اـﻗﻞ ﻣﻦ ﻣ ـ‬
‫ﻣﻦ ‪ ٦٠‬ـﻓﺄـﻧﺖ ﻫـﻨﺎ ﺳـ ــــــ ـﻮف ﺗـﺒﺪأ اﺧﺘـﺒﺎر درﺟـﺘﻚ اﻟﺘﻲ ﺣﻘﻘﺘـﻬﺎ ـ‬
‫ﺟﺔ ﻣﻤـﺘﺎز أم‬
‫ﻫﻞ أـﻧﺎ ـﻧﺎﺟﺢ ـﺑﺪر ـ‬
‫ﺠﺎح ‪ ،‬وإن ـﻛﺎـﻧﺖ أ ﻛﺒﺮ ﻓﻤﻦ اﻟﻄﺒﻴﻌﻲ ﺳـ ــــــ ـﻮف ﻳﺘـﺒﺎدر ـﻟﺬﻫـﻨﻚ ـ‬
‫اﻟﻨ ـ‬
‫ﺟﻴﺪ ؟‪.‬‬

‫ﻣﻦ ﻫﺬه اﻟﻤﻘﺪﻣﺔ ﻳﺘﻀـﺢ ﻟﻨﺎ ﺟﻠﻴﺎ ً أن اﻟﺪرس ﺳـﻮف ﻳﻜﻮن ﻋﻦ اﻟﺠﻤﻞ اﻟﺸـﺮﻃﻴﺔ وﻃﺮ ﻳﻘﺔ‬
‫ﻛﺘﺎﺑﺘﻬﺎ‪.‬‬

‫ﻓﻲ اﻟﺒﺪا ﻳﺔ ﺳﻨﻮﺿﺢ أن اﻟﺠﻤﻞ اﻟﺸﺮﻃﻴﺔ ﻓﻲ ﻟﻐﺔ ‪ Kotlin‬ﻫﻲ ) ‪.( if ..else – when‬‬

‫اﻟﺠﻤﻠﺔ ‪if‬‬

‫اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ‪:‬‬

‫{ )‪if (testExpression‬‬

‫‪// codes to run if testExpression is true‬‬

‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪84‬‬


‫{ ‪else‬‬

‫‪// codes to run if testExpression is false‬‬

‫}‬

‫ﻳﻤﻜﻦ ﻛﺘﺎﺑﺔ ‪ if‬اﻟﺸﺮﻃﻴﺔ ﻟﺘﺤﻘﻖ ﻣﻦ ﺷﺮط واﺣﺪ وﺗﻜﻮن ﺑﺸﻜﻞ ﺑﺴﻴﻂ‪.‬‬

‫اذا ﺗﺤﻘﻖ اﻟﺸ ـﺮط ﻧﻔﺬ ﻣﺎﺑﺪاﺧﻞ ‪ if‬اذا ﻟﻢ ﻳﺘﺤﻘﻖ ﺗﺠﺎوز ﺑﺪون ان ﻳﻜﻮن ﻫﻨﺎك اي اﺣﺘﻤﺎل‬
‫آﺧﺮ‪.‬‬

‫) ‪if ( 5 < 10‬‬

‫) “اﻟﻌدد ﺧﻣﺳﺔ اﻗل ﻣن اﻟﻌدد ﻋﺷرة ‪ ،‬ﻣﺗﻔﺎﺟﺊ ﺣﻘﯾﻘﺔً” (‪print‬‬

‫‪if ..else‬‬

‫ر ﺑﻤﺎ ﻳﻜﻮن ﻟﺪﻳﻨﺎ اﺣﺘﻤﺎﻟﻴﻦ ﻟﻞ ‪ if‬ﻛﻤﺎ ﺳـ ــــــ ـﻨﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل اﻟﻘﺎدم وﻟﺬﻟﻚ ﺳـ ــــــ ـﻨﺤﺘﺎج اﻟﻰ‬
‫اﺳ ـﺘﺨﺪام ‪ else‬ﻃﺮ ﻳﻘﺔ ﻛﺘﺎﺑﺔ ﺷ ـﺮط ﺑﺴ ـﻴﻂ ﻋﺒﺎرة اﻟﺸ ـﺮط وإذا ﻟﻢ ﻳﺘﺤﻘﻖ ﻓﺴ ـﻮف ﻳﺘﻨﻔﺬ أﻣﺮ‬
‫أﺧﺮ ‪،‬‬

‫§ ﻣﺜﺎل‬

‫ﻫﻨﺎ ﺳـ ــ ـﻮف ﻳﻄﻠﺐ ﻣﻦ اﻟﻤﺴـ ــ ـﺘﺨﺪم إدﺧﺎل اﺳـ ــ ـﻢ ﺣﺴـ ــ ـﻨﺎ ً و وﻣﻦ ﺛﻢ ﻳﻘﻮم ﺑﻤﻘﺎرﻧﺔ اﻻﺳـ ــ ـﻢ‬
‫اﻟﻤﺪﺧﻞ ﻫﻞ ﻫﻮ أﺣﻤﺪ؟‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪85‬‬


‫إذا ﻛﺎن ﻧﻌﻢ ﻓﺴـ ـﻴﻄﺒﻊ ﻟﻪ ﻣﺮﺣﺒﺎ ً أﺣﻤﺪ وإذا ﻟﻢ ﻳﺘﺤﻘﻖ اﻟﺸـ ـﺮط وأدﺧﻞ اﻟﻤﺴـ ـﺘﺨﺪم اﺳـ ـﻢ‬
‫أﺧﺮ ﺳﻮف ﻳﻄﺒﻊ ﻟﻪ ﺧﻄﺄ‪.‬‬

‫)"‪println("Please enter your name :‬‬


‫!!)(‪var Name:String= readLine‬‬

‫)"‪if(Name == "Ahmed‬‬
‫)"‪println("Welcome $Name‬‬
‫‪else‬‬
‫)"‪println("Error‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪Welcome Ahmed‬‬

‫‪if ..else if‬‬

‫ر ﺑﻤﺎ ﺗﺤﺘﺎج او ﻟﺪﻳﻚ ا ﻛﺜﺮ ﻣﻦ ﺷﺮط ﺗﺮ ﻳﺪ اﻟﺘﺤﻘﻖ اي ﻣﻨﻬﻢ ﻗﺪ ﺗﻨﻔﺬ‪.‬‬

‫§ ﻣﺜﺎل‬

‫ﺳﻴﺔ اﻟﺘﻲ ﻃﺮﺣﻨﺎﻫﺎ ﻓﻲ اﻟﻤﻘﺪﻣﺔ ‪ ،‬ﺟﻤﻴﻌﻨﺎ ﻧﻌﻠﻢ أن ﻣﻦ ﻳﺤ ـ‬


‫ﺼﻞ‬ ‫ﺿﻮع اﻟﻤﺎدة اﻟﺪرا ـ‬
‫ﻣﺜﻼ ﻛﻤﻮ ـ‬
‫ﻋﻠﻰ ‪ ٩٠‬وأ ﻛﺜﺮ ﻳﺄﺧﺬ ﻣﻤﺘﺎز ‪ ،‬وﻣﻦ ﻳﺤﺼﻞ ﻣﻦ ‪ ٨٠‬إﻟﻰ ‪ ٨٩‬ﻳﺄﺧﺬ ﺟﻴﺪ ﺟﺪا ً … وﻫﻜﺬا‪.‬‬

‫)"‪println("Please enter your mark :‬‬


‫)(‪var mark: Float = readLine()!!.toFloat‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪86‬‬


if(mark >= 90)
println("$mark Excellent")
else if(mark >= 80 && mark < 90)
println("$mark Very Good")
else if(mark >= 70 && mark < 80)
println("$mark Good")
else if(mark >= 60 && mark < 70)
println("$mark study hard")
else
println("$mark failed")

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
Please enter your mark :

78

78.0 Good

‫ اﻟﻤﺘﺪاﺧﻠﺔ‬If

.‫ﺑﻌﺾ اﻟﺸﺮوط او اﻟﻤﺘﻄﻠﺒﺎت ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﻣﺘﻄﻠﺒﺎت ﻣﺘﺪاﺧﻠﺔ‬

:‫اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ‬

if( boolean_expression 1) {

/* Executes when the boolean expression 1 is true */

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 87 ‫اﻟﺼﻔﺤﺔ‬


if(boolean_expression 2) {

/* Executes when the boolean expression 2 is true */

‫ ﺗﺤﻘﻖ اﻟﺸـ ـــ ـﺮط ﺳـ ـــ ـﻴﺪﺧﻞ‬100 ‫ ﻳﺴـ ـــ ـﺎوي‬a ‫ اذا ﻛﺎن‬a & s ‫ﻣﺜﻼ ً اردﻧﺎ اﻟﺘﺤﻘﻖ ﻣﻦ رﻗﻤﻴﻦ‬
.‫ اﻟﺦ‬.. ‫ وﻫﻜﺬا‬200 ‫ ﺗﺴﺎوي‬s ‫ اﺧﺮى ﺗﺮ ﻳﺪ اﻟﺘﺤﻘﻖ ﻣﻦ ﻫﻞ‬if ‫ ﻟﻴﺠﺪ‬if ‫داﺧﻞ‬

var a = 100
var s = 200
/* check the boolean condition */
if( a == 100 ) {
/* if condition is true then check the following */
if( s == 200 ) {
/* if condition is true then print the following */
print("Value of a is 100 and s is 200\n" );
}
}

if ‫اﻟﺘﻌﺒﻴﺮات ﻣﻊ‬

‫ ﻓﻲ ﺗﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات‬if ‫ وﻻ ﺗﻮﺟﺪ ﻓﻲ ﺟﺎﻓﺎ ﻫﻲ اﺳ ـﺘﺨﺪام‬kotlin ‫ﻣﻦ اﻻﺷ ـﻴﺎء اﻟﺠﻤﻴﻠﺔ ﻓﻲ‬
.‫ﻣﺒﺎﺷﺮة واﻋﺎدة ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﻴﺮ اﻟﻤﻌﺮف‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 88 ‫اﻟﺼﻔﺤﺔ‬


‫ﻳﻌﻜﺲ ﻫﺬا اﺧﺘﺼﺎر ﻛﺒﻴﺮ ﻓﻲ ﻛﺘﺎﺑﺔ اﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ وﺗﺮﺗﻴﺒﻬﺎ‪.‬‬

‫§ ﻣﺜﺎل‬
‫‪val a = 100‬‬
‫‪val b = 200‬‬

‫{ )‪val max = if (a < b‬‬


‫)"‪print("Choose a‬‬
‫‪a‬‬
‫{ ‪} else‬‬
‫)"‪print("Choose b‬‬
‫‪b‬‬
‫}‬
‫)"‪print("max = $max‬‬

‫ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ ﻳﻦ واﺳـﻨﺪﻧﺎ ﻟﻬﻢ ﻗﻴﻢ وﻓﻲ اﻟﻤﺘﻐﻴﺮ اﻟﺜﺎﻟﺚ ﻋﺮﻓﻨﺎ ‪ max‬ﺳـﻴﺤﺼـﻞ ﻋﻠﻰ اﻟﻘﻴﻤﺔ‬
‫اﻻﻋﻠﻰ ﺑﻴﻦ ‪.a & b‬‬

‫ﻳﺠﺐ ان ﺗﺤﺘﻮي ‪ if‬ﻋﻠﻰ اﺣﺘﻤﺎﻟﻴﻦ او ا ﻛﺜﺮ ﻟﺴﺘﺨﺪﻣﻬﺎ ﻛـ ‪.Expression‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪89‬‬


‫اﻟﺪوال‬

‫اﻟﺪ و ال‬

‫اﻟﺪوال اﺷـ ــــ ـﻬﺮ ﻣﻦ ﻧﺎر ﻋﻠﻰ ﻋﻠﻢ ﻓﻲ ﻋﺎﻟﻢ اﻟﺒﺮﻣﺠﺔ ﺟﻤﻴﻌﻨﺎ ﻧﻌﻠﻢ أﻫﻤﻴﺔ اﺳـ ــــ ـﺘﺨﺪاﻣﻬﺎ واﻧﻬﺎ‬
‫ﺗﺨﺘﺼﺮ اﻟﻮﻗﺖ ﻋﻠﻴﻨﺎ ﻓﻲ ﺗﻜﺮار اﻟﻌﻤﻠﻴﺎت وﺗﻮﻓﺮ اﻟﺠﻬﺪ‪.‬‬

‫أوﻻ ‪ :‬ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺘﻬﺎ‬

‫ﺗﻌﺮ ﻳﻔﻬﺎ ﺟﺪا ﺑﺴـﻴﻂ ﻧﺴـﻤﻲ اﻟﺪاﻟﺔ وﻳﻔﻀـﻞ ﺗﺴـﻤﻴﺘﻬﺎ ﻛﻤﺎ ﻧﻌﻠﻢ ﺟﻤﻴﻌﺎ ﺑﺎﺳـﻢ ﻳﻤﺜﻠﻬﺎ أي‬
‫ﻳﻤﺜﻞ اﻟﻐﺮض اﻟﺬي ﻣﻦ اﺟﻠﻪ اﻧﺸـ ـــ ـﺄﺗﻬﺎ ‪:Unit ،‬ﻫﺬا ﻳﻌﻨﻲ ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻌﺎﺋﺪة وﻫﻨﺎ ﻳﻘﺼـ ـــ ـﺪ‬
‫أﻧﻬﺎ ﻻ ﺗﻌﻮد ﺑﺸـﻲء وﻣﻦ اﻟﻤﻤﻜﻦ أن ﻻ ﻧﻜﺘﺒﻬﺎ وﻫﻮ ﺳـﻴﻌﺮف اﻧﻬﺎ داﻟﺔ ﻻ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ‪ ،‬وﻣﻦ ﺛﻢ‬
‫ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻷواﻣﺮ اﻟﺘﻲ ار ﻳﺪﻫﺎ ﺑﺪاﺧﻞ اﻻﻗﻮاس‪.‬‬

‫‪fun functionNAme( parameter ):Unit‬‬


‫{‬
‫‪return ...‬‬
‫}‬

‫ﺛﺎﻧﻴﺎ ‪ :‬أﻧﻮاع اﻟﺪوال‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪90‬‬


‫ ﻧﻤﺮر ﻟﻬﺎ ﺑﻴﺎﻧﺎت وﺗﻌﻮد ﺑﻘﻴﻤﺔ‬v

fun maxNumber( number1:Int ,number2:Int):Int


{
if(number1<number2)
{
return number2
}
else {
return number1
}
}

.‫ وﺗﻌﻮد ﺑﻘﻴﻤﺔ اﻟﻌﺪد اﻷﻛﺒﺮ‬number1 ,number2 ‫ﻣﺮرﻧﺎ ﻟﻬﺎ ﻣﺘﻐﻴﺮ ﻳﻦ وﻫﻤﺎ‬

‫ ﻧﻤﺮر ﻟﻬﺎ ﺑﻴﺎﻧﺎت وﻻ ﺗﻌﻮد ﺑﻘﻴﻤﺔ‬v

fun circleCirc(radius:Float):Unit
{
val bai=3.14
var circumference = bai *2 * radius
println("the circumference of circle is :" +circumference)
}

‫ ﻻ ﻧﻤﺮر ﻟﻬﺎ ﺑﻴﺎﻧﺎت وﺗﻌﻮد ﺑﻘﻴﻤﺔ‬v

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 91 ‫اﻟﺼﻔﺤﺔ‬


‫‪fun minNumber( ):Int‬‬
‫{‬
‫)(‪var number1:Int = readLine()!!.toInt‬‬
‫)(‪var number2:Int = readLine()!!.toInt‬‬
‫)‪if(number1<number2‬‬
‫{‬
‫‪return number1‬‬
‫}‬
‫{ ‪else‬‬
‫‪return number2‬‬
‫}‬
‫}‬

‫‪ v‬ﻻ ﻧﻤﺮر ﻟﻬﺎ ﺑﻴﺎﻧﺎت وﻻ ﺗﻌﻮد ﺑﻘﻴﻤﺔ‬

‫{)(‪fun welcome‬‬
‫)"‪return println("welcome world‬‬
‫}‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻻﺳﺘﺪﻋﺎء‬

‫ﺣﺴـ ــــــ ـﻨﺎ ً ﻧﺤﻦ ﻋﺮﻓﻨﺎ اﻵن اﻟﺪوال وﻃﺮ ﻳﻘﺔ ﻛﺘﺎﺑﺘﻬﺎ‪ ،‬ﺗﺒﻘﻰ ﻋﻠﻴﻨﺎ ﻣﻌﺮﻓﺔ ﻃﺮ ﻳﻘﺔ اﺳـ ــــــ ـﺘﺪﻋﺎﺋﻬﺎ‬
‫وﻫﻲ ﺟﺪا ً ﺑﺴﻴﻄﺔ ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬

‫ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﺳﻢ اﻟﺪاﻟﺔ وان ﻛﺎﻧﺖ ﺗﻤﺮر ﻟﻬﺎ ﻗﻴﻢ ﻓﻼ ﻧﻨﺴﻰ ﻛﺘﺎﺑﺔ ﻫﺬه اﻟﻘﻴﻢ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪92‬‬


:‫§ ﻣﺜﺎل‬

:‫داﻟﺔ ﺗﺤﺴﺐ ﻣﺴﺎﺣﺔ اﻟﻤﺮ ﺑﻊ‬

fun distance( a :Int ):Int{


return a*a
}

:‫داﻟﺔ ﺗﺤﺴﺐ ﻣﺤﻴﻂ اﻟﻤﺮ ﺑﻊ‬

fun circumference(a:Int):Int{
return a*4
}

:‫ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

fun main(args:Array<String>){

println("enter the length side for square :")


var len:Int= readLine()!!.toInt()
println("the distance is :"+distance(len))
println("the circumference is :"+circumference(len))
}

:‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬


enter the length side for square :
3

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 93 ‫اﻟﺼﻔﺤﺔ‬


‫‪the distance is :9‬‬
‫‪the circumference is :12‬‬

‫‪Extension function‬‬

‫ﺿﺢ‬
‫ﺳﺒﻖ وﺗﻌﺮﻓﻨﺎ وﻟﻜﻦ ﻛﻴﻒ ﺗﻜﻮن اﻣﺘﺪاد او ‪ extension‬؟ او ﻟﻨﻮ ـ‬
‫ﺗﻌﺘﺒﺮ داﻟﺔ ﻋﺎدﻳﺔ ﻛﻤﺎ ـ‬
‫اﻟﺴﺆال أ ﻛﺜﺮ ﻣﺎ ﻓﺎﺋﺪﺗﻬﺎ ؟‬

‫ﻣﺎذا ﻟﻮ اردﻧﺎ اﺿـﺎﻓﺔ داﻟﺔ ﻏﻴﺮ ﻣﻮﺟﻮدة ﻣﺴـﺒﻘﺎ ً ﻓﻲ ‪ class string‬ﻣﺜﻼ ً ؟ ﺣﺘﻤﺎ ً ﺳـﺘﺤﺘﺎج اﻟﻰ‬
‫‪extension‬وﺳﺎوﺿﺤﻬﺎ ﻫﻨﺎ ﻓﻲ ﻣﺜﺎﻟﻴﻦ‪:‬‬

‫ﺣﺴ ـﻨﺎ ﻧﺴ ـﺘﻄﻴﻊ ﺑﻨﺎء داﻟﺔ ﺗﻜﻮن اﻣﺘﺪاد ﻟﻄﺒﻘﺔ ﻣﺎ ‪ class‬دون اﻟﺘﻌﺮ ﻳﻒ ﻋﻨﻬﺎ ‪ ،‬ﻣﺜﺎل ﻋﻠﻰ‬
‫ذﻟﻚ‪:‬‬

‫‪ v‬ﻃﺒﻘﺔ }‪ {class‬ﺧﺎﺻﺔ ﺑﺎﻟﺴﻴﺎرة‬

‫ﻟﻨﻔﺮض اﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺎﻧﺸﺎء ‪ class‬ﻟ ـ ـــــ ـ ‪car‬وﻛﺎن ﻳﺤﺘﻮي ﻋﻠﻰ ‪ func‬واﺣﺔ ﻓﻘﻂ وﻫﻲ ﻟﺤﺴﺎب‬
‫اﻟﺴﺮﻋﺔ اذا ﻛﺎﻧﺖ ﻣﻨﺨﻔﻀﺔ‪.‬‬

‫{‪class Car‬‬
‫{‪fun LowSpeed(sp:Int):Boolean‬‬
‫‪return sp <100‬‬
‫}‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪94‬‬


‫‪ v‬داﻟﺔ ‪ extension‬ﻟﻠﻄﺒﻘﺔ ‪car‬‬

‫اﻻن ﺑﻌﺪ ﻓﺘﺮة ﻣﻦ اﻟﻮﻗﺖ اﺣﺘﺠﺖ ان اﻗﻮم ﺑﺎﺿ ـﺎﻓﺔ داﻟﺔ ﺟﺪﻳﺪة ل ‪class car‬وﻟﻜﻦ ﻻ ار ﻳﺪ‬
‫اﻟﺘﻌﺪﻳﻞ ﻋﻠﻴﻪ ؟ ﺳﺎﻗﻮم ﺑﺎﺳﺘﺨﺪام ‪ extension‬ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔ‪:‬‬

‫{‪fun Car.highSpeed(sp:Int):Boolean‬‬
‫‪return sp >100‬‬
‫}‬

‫ﻧﻼﺣﻆ أﻧﻬﺎ داﻟﺔ ﻋﺎدﻳﺔ وﻟﻜﻦ ﻟﺘﻜﻮن اﻣﺘﺪاد ﻟﻄﺒﻘﺔ ﻣﺎ ﻧﻘﻮم ﺑﻮﺿـ ــ ـﻊ اﺳـ ــ ـﻢ اﻟﻄﺒﻘﺔ وﻣﻦ ﺛﻢ‬
‫اﺳﻢ اﻟﺪاﻟﺔ ﻛﻤﺎ ﻫﻮ ﻣﻼﺣﻆ ﻟﺪﻳﻨﺎ‪Car.highSpeed‬‬

‫‪ v‬ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

‫{)>‪fun main(args:Array<String‬‬

‫)(‪var car1= Car‬‬


‫)"‪println("please enter the speed:‬‬
‫)(‪var speed :Int = readLine()!!.toInt‬‬
‫))‪println("speed is : "+car1.LowSpeed(speed‬‬
‫))‪println("speed is : "+car1.highSpeed(speed‬‬

‫}‬

‫ﻟﺪﻳﻨﺎ أﻧﻮاع اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﻫﻲ )… ‪Int – String – Char‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪95‬‬


‫إﻟﺦ( وﻫﻲ ﺗﻌﺘﺒﺮ ‪ - classes‬ﻃﺒﻘﺎت ﺑﺎﻷﺳ ـﺎس وﻟﻬﺎ دواﻟﻬﺎ اﻟﺨﺎﺻ ـﺔ ﺑﻬﺎ وﺧﺼ ـﺎﺋﺼ ـﻬﺎ وﻣﻦ‬
‫ﺸﺎء داﻟﺔ اﻣﺘﺪاد‬ ‫ﺳﺎﺑﻘﺎ ﺣﻴﺚ ﻧ ـ‬
‫ﺴﺘﻄﻴﻊ اﻧ ـ‬ ‫ﻀﺎ ﻣﺎ ﻓﻌﻠﻨﺎ ـ‬
‫ﺴﺘﻄﻴﻊ اﻟﻘﻮل أﻧﻪ ﻳﻨﻄﺒﻖ ﻋﻠﻴﻬﺎ أ ﻳ ـ‬
‫ﻫﻨﺎ ﻧ ـ‬
‫ﺗﻜﻮن ﻟﻄﺒﻘﺔ ‪ String‬ﻣﺜﻼ أو ‪ Int‬او أي ﻃﺒﻘﺔ‪.‬‬

‫‪ v‬اﻟﻤﺜﺎل اﻟﺜﺎﻧﻲ‬

‫ار ﻳﺪ اﺿﺎﻓﺔ ‪ extension‬ﻟ ـ ـ ‪string class‬ﻟﻴﻘﻮم ﺑﺘﺤﻮﻳﻞ اﻟﻤﺴﺎﻓﺎت اﻟﻰ ‪ camelCase‬ﻻﺣﻆ‬


‫اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ‬

‫} ‪fun String.spaceToCamelCase() { ...‬‬

‫ﻛﺘﺒﻨﺎ اﺳـ ــ ـﻢ اﻟﻜﻼس ‪ String‬وﻗﻤﻨﺎ ﺑﺎﻧﺸـ ــ ـﺎء اﻟﺪاﻟﺔ اﻟﺠﺪﻳﺪة ‪ spaceToCamelCase‬واﻟﺘﻲ‬


‫ﺳﺘﻘﻮم ﺑﺘﺤﻮﻳﻞ اﻟﻨﺺ وﻃﺮ ﻳﻘﺔ اﺳﺘﺨﺪاﻣﻬﺎ ﻛﺎﻟﺘﺎﻟﻲ‬

‫)(‪"Convert this to camelcase".spaceToCamelCase‬‬

‫‪lambda function‬‬

‫اﻓﻀ ـﻞ ان اﺳ ـﻤﻴﻬﺎ اﻟﺪاﻟﺔ اﻟﻤﻀ ـﻤﻨﺔ وذﻟﻚ ﻷن ﻣﻦ اﻟﻮﻫﻠﺔ اﻷوﻟﻰ ﻋﻨﺪ اﻟﻨﻈﺮ إﻟﻴﻬﺎ ﺗﺴ ـﺘﻨﻜﺮ‬
‫أﻧﻬـﺎ داﻟـﺔ ﻓﻨﺤﻦ ﻛﻤـﺎ ﺗﻌﻠﻤﻨـﺎ أﻧﻨـﺎ ﻧﻘﻮم ﺑـﺄﻧﺸـ ـــــــ ـﺎء ﻣﺘﻐﻴﺮ وﻓﺘﺢ ﻗﻮﺳـ ــــــ ـﻴﻦ وﻣﻦ اﻟﻤﻤﻜﻦ ﺗﻤﺮ ﻳﺮ‬
‫ﻣﺘﻐﻴﺮات ﻟﻬـﺬا اﻟﻘﻮﺳـ ــــــ ـﻴﻦ اﻟـﺪاﺋﺮ ﻳﻴﻦ وﻣﻦ ﺛﻢ اﻷﻗﻮاس اﻟﻤﺮ ﺑﻌـﺔ وﺑـﺪاﺧﻠﻬـﺎ اﻟﺠﻤـﻞ اﻟﺒﺮﻣﺠﻴـﺔ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪96‬‬


‫اﻟﻤﺮاد ﺗﻨﻔﻴﺬﻫﺎ ‪ ،‬ﺣﺘﻰ ﺗﺄﺗﻴﻨﺎ ‪ lambda‬وﺗﻜﺴـ ـﺮ ﻫﺬه اﻟﻘﺎﻋﺪة وﺗﺼـ ـﺒﺢ ﻣﻀـ ـﻤﻨﺔ ﺑﺪاﺧﻞ ﻣﺘﻐﻴﺮ‬
‫أي أﻧﻨﺎ ﻧﻌﺮف ﻣﺘﻐﻴﺮ اﻟﻘﻴﻤﺔ اﻟﺬي ﻳﺤﻤﻠﻬﺎ ﻫﻲ داﻟﺔ‪.‬‬

‫اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ ﺗﻜﻮن ﺑﻬﺬا اﻟﺸﻜﻞ‬

‫{ = ‪val printMessage‬‬
‫)"!‪println("Hello, world‬‬
‫}‬

‫ﻳﻤﻜﻦ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ او ﺗﻨﻔﻴﺬﻫﺎ ﺑﻜﺘﺎﺑﺔ اﻟﺸﻔﺮة‬

‫)(‪printMessage‬‬
‫‪// or‬‬
‫)(‪printMessage.invoke‬‬

‫اﻣﺎ اذا اردﻧﺎ ﺗﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮات اﻟﻰ اﻟﺪاﻟﺔ ﻓﺎﻧﻨﺎ ﺳـﻨﺴـﺘﺨﺪم اﻟﺸـﻔﺮة اﻟﻘﺎدﻣﺔ وﺳـﻴﺘﻢ ﺗﻀـﻤﻴﻦ‬
‫اﻟﻤﺘﻐﻴﺮات داﺧﻠﻬﺎ ﻛﻤﺎ ﺳﺘﻼﺣﻆ‬

‫})"‪var printName = { name :String -> println("Hello $name‬‬

‫ﻧﻘﻮم ﺑﻔﺘﺢ أﻗﻮاس ﻣﺮ ﺑﻌـﺔ وﺑـﺪاﺧﻠﻬـﺎ ﻧﻌﺮف اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﺳـ ــــــ ـﻴﺘﻢ ﺗﻤﺮ ﻳﺮﻫـﺎ وﻣﻦ ﺛﻢ‬
‫اﻟﺴﻬﻢ وﻳﻠﻴﻪ ﺟﺴﻢ اﻟﺪاﻟﺔ وﻫﻲ اﻷواﻣﺮ اﻟﻤﺮاد ﺗﻨﻔﻴﺬﻫﺎ‪.‬‬

‫§ ﻣﺜﺎل‬
‫}‪val total : (Int , Int)->Int = {num1 , num2 -> num1+num2‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪97‬‬


‫§ وﺑﺪاﺧﻞ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬
‫{)>‪fun main(args:Array<String‬‬

‫))‪println("the total is :"+total(6,5‬‬

‫}‬

‫‪high level function‬‬

‫ﻫﺬه اـﻟﺪاـﻟﺔ ﻻ ﺗﻜﺘﻔﻲ ﻓﻘﻂ ﺑﺘﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮات‬ ‫ﻌﺎﻟﻲ و ـ‬


‫ﻫﺬا ﻳﻌﻨﻲ أن ـ‬ ‫اـﻟﺪاـﻟﺔ ﻣﻦ اﻟﻤﺴـ ــــــ ـﺘﻮى اﻟ ـ‬
‫ﻓﺮدﻳﺔ واﻧﻤﺎ أ ﻳﻀﺎ ﺗﻘﻮم ﺑﺘﻤﺮ ﻳﺮ داﻟﺔ وﻣﻦ اﻟﻤﻤﻜﻦ ان ﺗﺮﺟﻊ داﻟﺔ‪.‬‬

‫§ ﻟﻜﻲ ﻧﺴﺘﻄﻴﻊ اﻟﻘﻮل أﻧﻬﺎ داﻟﺔ ﻋﺎﻟﻴﺔ اﻟﻤﺴﺘﻮى ﻻﺑﺪ ﻣﻦ ﺗﻮﻓﺮ اﻻﺗﻲ‬
‫• ﺗﻤﺮر ﻟﻬﺎ داﻟﺔ ﻛﻮﺳﻴﻂ‪.‬‬
‫• ﺗﻌﻴﺪ داﻟﺔ‪.‬‬
‫• ﻧﺴﺘﻄﻴﻊ ﻓﻌﻞ اﻟﺨﻄﻮﺗﻴﻦ اﻟﺴﺎﺑﻘﺘﻴﻦ أ ﻳﻀﺎ ﻣﻌﺎ ً‪.‬‬

‫ﻤﻞ ﻋﻠﻰ‬
‫ﻋﺎﻟـﻴﺔ اﻟﻤﺴـ ــــــ ـﺘﻮى ﻓﻬﺲ ﺗﻌ ـ‬
‫ﺨﺪام ‪ lambda‬ارﺗـﺒﺎط وﺛﻴﻖ ـﺑﺎـﻟﺪاـﻟﺔ ـ‬
‫وﻳﺮﺗﺒﻂ اﺳـ ــــــ ـﺘ ـ‬
‫ﺗﺮﺗﻴﺐ اﻟﺠﻤﻞ اﻟﺒﺮﻣﺠﻴﺔ وﺟﻌﻠﻪ اﺳـ ــ ـﻬﻞ ﻛﻤﺎ ﻻ ﻳﺨﻔﻰ ﻋﻠﻴﻨﺎ ﺗﻘﻠﻞ ﻣﻦ اﻷﺳـ ــ ـﻄﺮ اﻟﺒﺮﻣﺠﻴﺔ ﻣﻤﺎ‬
‫ﻳﻌﻄﻴﻨﺎ ﺷﻜﻞ ﺑﺴﻴﻂ وﻧﻈﻴﻒ‪.‬‬

‫ﺳﻨﻘﻮم ﺑﻌﺮض ﻣﺜﺎل ﻟﺘﻮﺿﻴﺢ ﻣﻔﻬﻮم اﻟﺪاﻟﺔ ﻋﺎﻟﻴﺔ اﻟﻤﺴﺘﻮى‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪98‬‬


‫‪ v‬اﻟﺨﻄﻮة اﻷوﻟﻰ‬

‫اﻧﺸﺄﻧﺎ داﻟﺔ ﺑﺴﻴﻄﺔ ﺗﻘﻮم ﺑﺘﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮ ﻳﻦ‪:‬‬

‫– ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ وﻧﺮ ﻳﺪ ان ﻧﻄﺒﻊ اﻟﻌﺪد اﻟﺬي ﻳﺴﺒﻘﻪ واﻟﻌﺪد اﻟﺘﺎﻟﻲ ﻟﻪ‪.‬‬

‫– اﻟﻤﺘﻐﻴﺮ اﻟﺜﺎﻧﻲ ‪ :‬داﻟﺔ ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﻌﺪد اﻟﻤﺪﺧﻞ )ﻣﻊ اﻟﻌﻠﻢ ﻧﺴـ ـﺘﻄﻴﻊ أن ﻧﻨﺸـ ـﺊ داﻟﺔ‬
‫ﻻ ﻋﻼﻗﺔ ﻟﻬﺎ ﺑﺎﻟﻤﺘﻐﻴﺮ اﻟﺴﺎﺑﻖ ﻛﺄن ﺗﻘﻮم ﺑﺈﻧﺸﺎء داﻟﺔ ﺗﻠﻘﻲ اﻟﺘﺤﻴﺔ ﻣﺜﻼ ً(‪.‬‬

‫{)‪fun calculat( num1:Int , printNumber:(Int)->Unit‬‬

‫‪var PreviousNumber = num1 - 1‬‬


‫‪var NextNumber = num1 + 1‬‬
‫)‪printNumber(num1‬‬
‫‪println("the previous number is : $PreviousNumber and the next‬‬
‫)"‪number is : $NextNumber‬‬

‫}‬

‫ﻟﻨﺮﻛﺰ ﻗﻠﻴﻼ ﺑـﺎﻟـﺪاﻟـﺔ اﻟﻤﻤﺮرة وﻫﻲ ‪ : printNumber:(Int)->Unit‬وﻫـﺬا ﻳﻌﻨﻲ أﻧﻨـﺎ ﻋﻨـﺪﻣـﺎ‬


‫ﻧﻤﺮرﻫـﺎ ﻓﻘﻂ ﻧﻜﺘﻔﻲ ﺑﻜﺘـﺎﺑـﺔ ﻧﻮع اﻟﺒﻴـﺎن اﻟﻤـﺪﺧـﻞ وﻫﻮ ﻛﻤـﺎ ﻫﻮ ﻣﻮﺿـ ــــــ ـﺢ ﻟـﺪﻳﻨـﺎ ﻣﻦ ﻧﻮع ﻋـﺪد‬
‫ﺻـ ـــﺤﻴﺢ وﻣﻦ ﺛﻢ اﻟﺴـ ـــﻬﻢ اﻟﺬي ﻫﻮ أﺳـ ـــﺎﺳـ ـــﻲ وﻣﻦ ﺛﻢ ﻧﻮع اﻟﺨﺮج أو اﻟﺒﻴﺎن اﻟﻌﺎﺋﺪ ﻟﻨﺎ وﻫﻮ ﻓﻲ‬
‫اﻟﻤﺜﺎل ﻻ ﻳﻌﻮد ﺑﻘﻴﻤﺔ‬

‫‪ v‬اﻟﺨﻄﻮة اﻟﺜﺎﻧﻴﺔ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪99‬‬


‫ﺳﻨﻨﺸﺊ داﻟﺔ ﻣﻀﻤﻨﺔ ﺑﺪاﺧﻞ ﻣﺘﻐﻴﺮ‪:‬‬

‫})‪val myNumber : (Int)->Unit = {number -> println(number‬‬

‫ﺣﺴـﻨﺎ ً ﺳـﻨﺘﺤﺪث ﻋﻦ ﻫﺬا اﻷن ﻗﻠﻴﻼ ً ‪ ،‬ﻫﺬه ﻫﻴﺎ اﻟﺼـﻴﻐﺔ اﻟﺘﻲ ﺗﻌﻠﻤﻨﻬﺎ ﻛﻤﺎ ﺳـﺒﻖ ﻟﻨﺎ وﻟﻜﻦ‬
‫ﻧﺮ ﻳﺪ أن ﻧﻮﺿـ ـــ ـﺢ أن أﻫﻤﻴﺘﻬﺎ ﺗﻜﻤﻦ ﻓﻲ أﻧﻨﺎ ﻛﻤﺎ ﺳـ ـــ ـﻨﺮى ﻓﻲ اﻟﺨﻄﻮة اﻟﺜﺎﻟﺜﺔ ﺑﻌﺪ ﻗﻠﻴﻞ أﻧﻬﺎ ﺗﻮﻓﺮ‬
‫ﻋﻠﻴﻨﺎ اﻟﻮﻗﺖ ﺑﺪل ﻣﻦ أن ﻧﻨﺸﺊ داﻟﺔ ﺟﺪﻳﺪة أﺧﺮى ﻋﻨﺪ اﻻﺳﺘﺪﻋﺎء وﺳﻮف ﻧﺮى ذﻟﻚ‪.‬‬

‫‪ v‬اﻟﺨﻄﻮة اﻟﺜﺎﻟﺜﺔ‬

‫اﻻﺳﺘﺪﻋﺎء وﻫﻲ اﻟﺨﻄﻮة اﻟﻨﻬﺎﺋﻴﺔ‪:‬‬

‫{)>‪fun main (args:Array<String‬‬


‫)"‪println("please enter any number :‬‬
‫)(‪var number1 : Int = readLine()!!.toInt‬‬
‫)‪calculat(number1, myNumber‬‬
‫}‬

‫ﻣﻔﻬﻮم ‪jump & return‬‬

‫ﺑﺒﺴـﺎﻃﺔ ﺷـﺪﻳﺪة ﻧﺴـﺘﻄﻴﻊ اﻟﻘﻮل ﻋﻦ ‪ jump‬ﻫﻮ اﻧﻚ ﻋﻨﺪﻣﺎ ﺗﺮ ﻳﺪ اﺳـﺘﺪﻋﺎء داﻟﺔ ﻟﺘﻨﻔﻴﺬ ﻣﺎ‬
‫ﺑﺪاﺧﻠﻬﺎ ﻓﻬﻮ ﻓﻲ ﻋﻤﻠﻴﺔ اﻻﺳﺘﺪﻋﺎء ﻳﻘﻔﺰ او ﻳﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟ ـ ــ ـ ‪ jump‬إﻟﻰ اﻟﺪاﻟﺔ ﻧﻔﺴﻬﺎ ﻟﺘﻨﻔﻴﺬ ﻣﺎ‬
‫ﺑﺪاﺧﻠﻬﺎ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪100‬‬


‫ﺣﺴـ ـﻨﺎ ً اﻟﻘﻴﻤﺔ اﻟﺮاﺟﻌﺔ ﻣﻦ ﺗﻨﻔﻴﺬ اﻟﺪاﻟﺔ ﺗﺴـ ـﻤﻰ ﻋﻤﻠﻴﺔ ‪ return‬او ارﺟﺎع أي ﺑﻤﻌﻨﻰ ﻟﻮ‬
‫ﻟﺪي داﻟﺔ ﺗﺠﻤﻊ ﻋﺪدﻳﻦ وﺗﻌﻮد ﺑﺎﻟﻨﺎﺗﺞ ﻟﻄﺒﺎﻋﺘﻪ ﻋﻠﻰ اﻟﺸـﺎﺷـﺔ ﻓﻬﻨﺎ ﺣﺼـﻠﺖ ﻋﻤﻠﻴﺔ اﻟﻌﻮدة او‬
‫اﻟﺮﺟﻮع ﺑﻘﻴﻤـﺔ ﻣﻌﻴﻨـﺔ وﻟـﺬﻟـﻚ ﻋﻨـﺪﻣـﺎ ﺗﻜﻮن ﻟـﺪﻳﻨـﺎ داﻟـﺔ ﺗﻌﻴـﺪ ﻗﻴﻤـﺔ ﻣﻌﻴﻨـﺔ ﻳﺠـﺐ ﻋﻠﻴﻨـﺎ ﺗﻌﺮ ﻳﻒ‬
‫ﻣﺘﻐﻴﺮ ﻳﺘﺴﻘﺒﻞ ﻫﺬه اﻟﻘﻴﻤﺔ ﺑﺪاﺧﻠﻪ ‪ ،‬وﺳﻨﻤﺜﻞ ﻣﺎ ﺷﺮﺣﻨﺎه ﺳﺎﺑﻘﺎ ﺑﻤﺜﺎل ﺑﺴﻴﻂ ﻟﻠﺘﻮﺿﻴﺢ‪:‬‬

‫{‪fun sumFunction(num1:Int,num2:Int):Int‬‬
‫‪return num1 + num2‬‬
‫}‬

‫ﺳﻨﺮى اﻷن ﻛﻴﻒ‬


‫ﺴﺒﻘﺎ ‪ ،‬ـ‬
‫ﺿﺤﻨﺎ ﻣ ـ‬
‫ﺴﺎﻃﺔ ﺗﻘﻮم ﺑﺈﻋﺎدة ﻧﺎﺗﺞ اﻟﺠﻤﻊ ﻛﻤﺎ و ـ‬
‫ﻫﺬه اﻟﺪاﻟﺔ وﺑﻜﻞ ﺑ ـ‬
‫ﻳﺘﻢ اﻻﺳﺘﺪﻋﺎء‪:‬‬

‫{)>‪fun main(args:Array<String‬‬

‫)‪var result = sumFunction(4,5‬‬


‫)‪println(result‬‬

‫}‬

‫ﻫﻨﺎ ﻧﺮى ﻓﻲ ﺟﻤﻠﺔ اﻻﺳـ ـﺘﺪﻋﺎء اﻧﻬﺎ أﺳـ ـﻨﺪت إﻟﻰ ﻣﺘﻐﻴﺮ وذﻟﻚ ﻟﺘﺨﺰ ﻳﻦ اﻟﻘﻴﻤﺔ اﻟﺮاﺟﻌﺔ ‪ ،‬ﻟﻮ‬
‫ﻟﻢ ﺗﻜﻦ اﻟﺪاﻟﺔ ﺗﻌﻮد ﺑﻘﻴﻤﺔ ﻓﻬﻨﺎ ﻧﺴﺘﻄﻴﻊ ان ﻧﻜﺘﻔﻲ ﺑﺎﻻﺳﺘﺪﻋﺎء ﻓﻘﻂ ﺑﺪون اﻻﺳﻨﺎد ﻟﻤﺘﻐﻴﺮ‪.‬‬

‫ﺑﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪101‬‬


‫أوﻻ ‪ :‬اﻟﺒﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ‬

‫ـــــــــــ ــ‬ ‫ـــــــــــ ـ ـ‬ ‫ﺳـ ـــ ـﻮف ﻧﺘﻄﺮق ﻟﻤﻔﻬﻮم ﺟﺪﻳﺪ وﻫﻮ اﻟﺒﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ أو ﺷـ ـــ ـﻴﺌﻴﺔ ) ‪ ( OOP‬ـ‬
‫)‪ (Object-oriented programming‬اﻟﺘﻲ ﺗﻬـﺪف ﻟﺠﻌـﻞ اﻟﺒﺮﻧـﺎﻣﺞ ﻋﺒـﺎرة ﻋﻦ ﻣﺠﻤﻮﻋـﺔ ﻣﻦ‬
‫اﻟﻜﺎﺋﻨﺎت او ﺑﺎﻟﻤﻔﻬﻮم اﻟﻤﺘﺪاول ﻋﻨﻪ ” ﻛﻞ ﺷـﻲء ﻋﺒﺎرة ﻋﻦ ﻛﺎﺋﻦ ” ‪ .‬ﻛﻞ ﻛﺎﺋﻦ ﻋﺒﺎرة ﻋﻦ ﺣﺰﻣﺔ‬
‫ﻣﻦ اﻟﺒﻴﺎﻧﺎت‪ ،‬وﻳﺘﻢ ﺑﻨﺎء اﻟﺒﺮﻧﺎﻣﺞ ﺑﻮاﺳـ ـــ ـﻄﺔ اﺳـ ـــ ـﺘﺨﺪام اﻟﻜﺎﺋﻨﺎت ور ﺑﻄﻬﺎ ﻣﻊ ﺑﻌﻀـ ـــ ـﻬﺎ اﻟﺒﻌﺾ‬
‫وواﺟﻬﺔ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺨﺎرﺟﻴﺔ ﺑﺎﺳـ ـﺘﺦ دام ﻫﻴﻜﻠﻴﺔ اﻟﺒﺮﻧﺎﻣﺞ وواﺟﻬﺎت اﻻﺳـ ـﺘﺨﺪام اﻟﺨﺎﺻـ ـﺔ ﺑﻜﻞ‬
‫ﻛﺎﺋﻦ ‪.‬وﺗﺸﻤﻞ اﻟﺒﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ ﻣﺒﺎدئ رﺋﻴﺴﻴﺔ وﻫﻲ‪:‬‬

‫• اﻟﺘﻐﻠﻴﻒ‪(Encapsulation).‬‬
‫• إﺧﻔﺎء اﻟﺒﻴﺎﻧﺎت‪(Data Hiding).‬‬
‫• اﻟﻤﻴﺮاث‪(Inheritance).‬‬
‫• ﺗﻌﺪاﻷﺷﻜﺎل‪(Polymorphism).‬‬
‫• ﻣﻦ اﻟﻠﻐﺎت اﻟﺘﻲ ﺗﻌﻤﻞ ﺑﺎﻟﻜﺎﺋﻨﻴﺔ‪:‬‬
‫• ﻟﻐﺔ ﺳﻲ‪++‬‬
‫• ﻟﻐﺔ ﺟﺎﻓﺎ‬
‫• ﻟﻐﺔ ﺑﺎﻳﺜﻮن‬
‫• ﻟﻐﺔ دﻟﻔﻲ )ﻟﻐﺔ ﺑﺮﻣﺠﺔ(‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻣﻘﺪﻣﺔ ﻋﻦ ‪Classes & Object‬‬

‫ﺣﺴﻨﺎ ً ﻣﺎ ﻫﻮ اﻟﻜﺎﺋﻦ ‪ Object‬؟‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪102‬‬


‫ﻛﻞ ﺷـ ــ ـﻲء ﺗﺮاه أﻣﺎﻣﻚ ﻫﻮ ﻛﺎﺋﻦ ‪ ،‬اﻟﻜﺘﺎب ﻳﻌﺘﺒﺮ ﻛﺎﺋﻦ ‪ ،‬اﻟﺴـ ــ ـﻴﺎرة ﻛﺎﺋﻦ ‪ ،‬اﻟﻘﻠﻢ ﻛﺎﺋﻦ وﺣﺘﻰ‬
‫أﻧﺖ ﻳﺎ ﻋﺰ ﻳﺰي اﻟﻘﺎرئ ﻓﻲ ﺑﺮﻣﺠﺘﻨﺎ ﻫﺬه ﺗﻌﺘﺒﺮ ﻛﺎﺋﻦ ‪ ،‬وﻛﻞ ﻛﺎﺋﻦ ﻳﺘﻜﻮن ﻣﻦ ﺷـ ـﻴﺌﻴﻦ رﺋﻴﺴـ ـﻴﻴﻦ‬
‫وﻫﻤﺎ اﻟﺼ ـﻔﺎت واﻷﻓﻌﺎل ‪ ،‬ﻓﺎﻟﺼ ـﻔﺎت ﻫﻲ ﻛﻞ ﺳ ـﻤﺔ ﺗﻤﺘﻠﻜﻬﺎ ﻣﻦ ﺣﻴﺚ اﻻﺳ ـﻢ ‪ ،‬ﻋﻤﺮك ‪ ،‬ﻟﻮن‬
‫ﺷ ـﻌﺮك ‪ ،‬ﻟﻮن ﻋﻴﻨﻴﻚ ‪ ،‬اﻟﻄﻮل ‪ ،‬اﻟﻮزن واﻟﻜﺜﻴﺮ ﻣﻦ اﻟﺼ ـﻔﺎت أ ﻳﻀ ـﺎ ﻏﻴﺮﻫﻢ ‪ ،‬أﻣﺎ اﻷﻓﻌﺎل وﻫﻲ‬
‫اﻟﻮﻇـﺎﺋﻒ اﻟـﺬي ﺗﻘﻮم ﺑﻬـﺎ ﻣﺜـﻞ اﻟﻜﺘـﺎﺑـﺔ ‪ ،‬اﻟﻤﺸـ ــــــ ـﻲ ‪ ،‬وﻳﻨﻄﺒﻖ ﻧﻔﺲ اﻟﺤـﺪﻳـﺚ ﻋﻦ أي ﻛـﺎﺋﻦ أﺧﺮ‬
‫ﻧﻘﻮم ﺑﺘﺤﺪﻳﺪ ﺻـ ـــ ﻔﺎﺗﻪ وﻣﻦ ﺛﻢ وﻇﺎﺋﻔﻪ وﻧﻌﺒﺮ ﻋﻨﻬﺎ ﺑﺮﻣﺠﻴﺎ اﻟﺼـ ـــ ﻔﺎت ﺑﺎﻟﻤﺘﻐﻴﺮات أﻣﺎ اﻷﻓﻌﺎل‬
‫ﻓﻨﻌﺒﺮ ﻋﻨﻬﺎ ﺑﺎﻟﺪوال‪.‬‬

‫‪ Classes‬ﺑﺎﻟﻌﺮ ﺑﻴﺔ ﻳﻌﻨﻲ ﺗﺼـ ــ ـﻨﻴﻔﺎت وﻫﺬا ﻳﻌﻨﻲ أﻧﻨﺎ ﻧﻀـ ــ ـﻊ اﻷﺷـ ــ ـﻴﺎء ﻓﻲ ﺗﺼـ ــ ـﻨﻴﻒ ﻣﻌﻴﻦ ‪،‬‬
‫ﻟﻨﻔﺘﺮض أﻧﻨﺎ ﻧﺘﺤﺪث ﻋﻦ اﻟﺴـ ـﻴﺎرات ﺣﺴـ ـﻨﺎ ً ﻫﻨﺎﻟﻚ ﺳـ ـﻴﺎرة ‪ BMW‬وﻟﻪ ﻟﻮن ﻣﻌﻴﻦ وﺳـ ـﺮﻋﺎت‬
‫ﻣﻌﻴﻨﻪ وﺷـ ـﺮﻛﺔ ﺧﺎﺻـ ـﺔ ﺑﺈﻧﺘﺎﺟﻬﺎ وأ ﻳﻀـ ـﺎ ﻟﺪﻳﻨﺎ ‪ AUDI‬وأ ﻳﻀـ ـﺎ ﻟﻬﺎ ﺷـ ـﺮﻛﺔ ﺧﺎﺻـ ـﺔ وﻟﻮن ﻣﻌﻴﻦ‬
‫ﻋﺔ وﻣﺨﺘﻠـﻔﺔ وﻟﻜﻨﻬﻢ ﺟﻤﻴﻌﻬﻢ ﻳﻌﺘﺒﺮون ﺻـ ــــــ ـﻮرة ﻟﺼـ ــــــ ـﻨﻒ‬
‫ﻋﺔ ﻣﺘﻨﻮ ـ‬
‫ﻜﺬا ـﻟﺪﻳـﻨﺎ ﻣﺠﻤﻮ ـ‬
‫…إﻟﺦ وﻫ ـ‬
‫اﻟﺴـﻴﺎرات ‪ ،‬أي أﻧﻨﺎ ﻓﻲ ﺑﺮﻧﺎﻣﺠﻨﺎ ﺳـﻨﺘﺤﺪث ﻋﻦ اﻟﺴـﻴﺎرات ﺻـﺤﻴﺢ ؟ إذا ﻧﻘﻮم ﺑﺈﻧﺸـﺎء ﺗﺼـﻨﻴﻒ‬
‫ﻟﻠﺴـ ـﻴﺎرات ﻧﻌﺮف ﺑﻪ اﻟﺼـ ـﻔﺎت اﻟﻌﺎﻣﺔ ﺑﻬﺎ ﻣﺜﻞ اﻻﺳـ ـﻢ ‪ ،‬اﻟﺸـ ـﺮﻛﺔ اﻟﻤﺼـ ـﻨﻌﺔ ﻟﻪ ‪ ،‬اﻟﻠﻮن وﻧﻀـ ـﻊ‬
‫ﻛﺬﻟﻚ داﺧﻞ اﻟﺘﺼﻨﻴﻒ اﻟﺪوال اﻟﺨﺎﺻﺔ ﺑﺎﻟﺴﻴﺎرة ﻛﺎﻟﺴﺮﻋﺔ واﻟﺘﻮﻗﻒ ﻣﺜﻼ ً‪.‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﻔﺮق ﺑﻴﻦ ‪Classes & Object‬‬

‫ﻋﺮﻓﻨﺎ ﻣﺎ ﻫﻮ اﻟﺘﺼـﻨﻴﻒ ]‪ [Class‬وﻣﺎ ﻫﻮ اﻟﻜﺎﺋﻦ ]‪ [Object‬وﺑﺸـﻜﻞ ﺑﺴـﻴﻂ ﺳـﺄوﺿـﺢ ﻟﻚ‬


‫اﻟﻔﺮق ﺑﻴﻨﻬﻢ ‪ ،‬اﻷن ﺑﻌﺪ ﻣﺎ وﺿـ ــ ـﻌﻨﺎ ﺗﺼـ ــ ـﻨﻴﻒ ﺧﺎص ﺑﺎﻟﺴـ ــ ـﻴﺎرات ﻳﺤﻤﻞ اﻟﻤﺘﻐﻴﺮات واﻟﺪوال ‪،‬‬
‫واﻟﺴـ ــــ ـﻴﺎرات اﻟﺬي ذﻛﺮﻧﺎﻫﺎ ﻓﻲ اﻷﻋﻠﻰ ‪ BMW , AUDI ,FORD‬وﻏﻴﺮﻫﻢ ﻣﺎ ﻫﻢ إﻻ ﻛﺎﺋﻨﺎت ﻣﻦ‬
‫ﻫﺬا اﻟﺼﻨﻒ أي أﻧﻬﻢ ﺻﻮرة ﻟﻬﺬا اﻟﺼﻨﻒ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪103‬‬


‫‪Classes OOP‬‬

‫أوﻻ ً ‪ :‬ﻃﺮﻳﻘﺔ إﻧﺸﺎء اﻟﺼﻨﻒ ‪class‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪104‬‬


‫{ ‪class Car‬‬
‫""= ‪var name :String‬‬
‫""= ‪var color :String‬‬
‫‪var model :Int = 0‬‬
‫‪var price :Int = 0‬‬

‫{)‪fun spead(sp:Int‬‬
‫{)‪if(sp > 100‬‬
‫)"‪println("Speed is slow‬‬
‫{‪} else‬‬
‫)"‪println("High speed‬‬
‫}‬
‫}‬
‫}‬

‫ﻫﻨﺎ ﻣﺜﺎل ﻟ ـ ـــــ ـ ‪ Class‬اﻟﺴﻴﺎرة وﺿﻌﻨﺎ ﺑﺪاﺧﻠﻪ اﻟﺼﻔﺎت اﻟﺘﻲ ﻋﺮﻓﻨﺎ اﻧﻨﺎ ﻧﻤﺜﻠﻬﺎ ﺑﺮﻣﺠﻴﺎ ً ﺑﺎﻟ ـ ـــــ ـ‬
‫‪Variables‬وﻫﻲ اﻻﺳ ـﻢ واﻟﻠﻮن واﻟﻤﻮدﻳﻞ واﻟﺴ ـﻌﺮ ﻣﺜﻼ وﻟﻜﻦ ﻧﺮ ﻳﺪ ﺗﻮﺿ ـﻴﺢ أﻣﺮ ﻋﻨﺪ ﺗﻌﺮ ﻳﻒ‬
‫اﻟﻤﺘﻐﻴﺮات ﺑﺪاﺧﻞ اﻟﺘﺼﻨﻴﻒ ﻻﺑﺪ ﻣﻦ أن ﺗﻘﻮم ﺑﺘﻤﻬﻴﺪ ﻗﻴﻤﺔ ﻟﻬﺬا اﻟﻤﺘﻐﻴﺮ ﻷن ﻟﻐﺔ اﻟـ ـ ‪kotlin‬‬
‫ﻻ ﺗﺴـ ــــ ـﻤﺢ ﻟﻚ ﺑﺘﻌﺮ ﻳﻔﻪ ﺑﺪون ان ﺗﻤﻬﺪ ﻟﻪ ‪ ،‬وﻧﻼﺣﻆ أ ﻳﻀـ ــــ ـﺎ اﻧﻨﺎ ﻻ ﻧﻘﻮم ﺑﺈﻋﻄﺎء ﻗﻴﻤﺔ ﺣﻘﻴﻘﻴﺔ‬
‫ﻛﻤﺎ ﻋﺮﻓﻨﺎ ﻓﺎﻟﻘﻴﻢ ﺗﻌﻄﻰ ﻋﻨﺪ اﻧﺸﺎء ﻛﺎﺋﻦ أﻣﺎ ﻫﻨﺎ ﻓﻨﺤﻦ ﻓﻘﻂ ﻧﻌﻄﻲ اﻟﺼﻔﺎت واﻻﻓﻌﺎل‪.‬‬

‫ﻃﺮ ﻳﻘﺔ أﺧﺮى ﻟﺘﻤﻬﻴﺪ ﻗﻴﻢ اﻟﻤﺘﻐﻴﺮات ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬

‫‪var name :String? = null‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪105‬‬


‫اﻷن ﺳـ ـــ ـﺘﻘﻮل ﻟﻲ ﻣﺎ ﻫﻮ ﻧﺎﺗﺞ ﺗﻨﻔﻴﺬ ﻫﺬا اﻟﻜﻮد ؟ ﺳـ ـــ ـﺄﻗﻮل ﻟﻚ ﻻ ﺷـ ـــ ـﻲء ﻳﺎﻋﺰ ﻳﺰي ‪ .‬ﻧﻌﻢ ﻻ‬
‫ﺷـ ـﻲء ‪ ،‬ﻟﻤﺎذا ﻷﻧﻨﺎ ﻓﻘﻂ ﻗﻤﻨﺎ ﺑﺈﻋﻼم اﻟﺒﺮﻧﺎﻣﺞ ﺑﺈﻧﺸـ ـﺎء ﺗﺼـ ـﻨﻴﻒ ﻳﻤﺮر ﻟﻪ ﺑﻴﺎﻧﺎت ﻣﻌﻴﻨﺔ ﻓﻘﻂ ‪،‬‬
‫ﻣﺘﻰ ﺳﻴﻨﻔﺬ اﻷﻣﺮ ؟ وﻫﺬا ﻫﻮ اﻟﺠﺰء اﻟﺜﺎﻧﻲ اﻟﻤﻬﻢ ﻓﻲ درﺳﻨﺎ وﻫﻮ اﻟﻜﺎﺋﻦ‪.‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻃﺮﻳﻘﺔ إﻧﺸﺎء ﻛﺎﺋﻦ ‪Object‬‬

‫اﻟﻜﺎﺋﻦ ﻳﺎ ﻋﺰ ﻳﺰي ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺻـ ـﻮرة ﻟﻠﺘﺼـ ـﻨﻴﻒ اﻟﺬي أﻧﺸـ ـﺄﻧﺎه ﺳـ ـﺄوﺿـ ـﺢ ﻟﻚ اﻷﻣﺮ ﻣﺮة‬
‫أﺧﺮى وﻫﻲ أن اﻟﺴـ ــ ـﻴﺎرات ﺟﻤﻴﻌﻬﺎ ﺑﻤﺨﺘﻠﻒ أﻧﻮاﻋﻬﺎ ﺗﺠﺘﻤﻊ ﺑﺄن ﻟﻬﺎ ﺻـ ــ ـﻔﺎت ﻣﺸـ ــ ـﺘﺮﻛﺔ ﻣﺜﻞ‬
‫ﺼ ﻨﻒ‬
‫ﺸﺊ ﻣ ـ‬
‫ﺳﺮﻋﺔ ﻓﻬﻨﺎ ﻧﻨ ـ‬
‫ﺳﻴﺎرة ﺗﺤﻤﻞ ﻣﻮدﻳﻞ وﻟﻮن و ـ‬
‫ﺳﻢ وﻛﻞ ـ‬
‫ﺳﻴﺎرة ﺗﺤﻤﻞ ا ـ‬
‫ﺳﻢ ﻓﻜﻞ ـ‬
‫اﻻ ـ‬
‫ﻳﻀﻢ ﻛﻞ اﻟﺼﻔﺎت واﻻﻓﻌﺎل اﻟﺘﻲ ﺗﺸﺘﺮك ﻓﻴﻬﺎ ﻛﻞ اﻟﺴﻴﺎرات ﺣﺴﻨﺎ ً أ ﻳﻦ اﻻﺧﺘﻼف ؟ اﻻﺧﺘﻼف‬
‫ﻫﻮ ﻧﻮع اﻟﺒﻴﺎن اﻟﻤﺪﺧﻞ ﻓﺴـ ــــ ـﻴﺎرة ﻣﻦ ﻧﻮع ﻓﻮرد ﻣﺨﺘﻠﻔﺔ ﻋﻦ ﺳـ ــــ ـﻴﺎرة ﻧﻮع اودي وﻫﻜﺬا ‪ ،‬ﻧﻘﻮم‬
‫ﺑﺈﻧﺸﺎء اﻟﻜﺎﺋﻦ ﻓﻲ داﺧﻞ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‪:‬‬

‫)(‪var object1 = Car‬‬

‫ﻫﻜﺬا ﻧﺤﻦ اﻧﺸ ـﺄﻧﺎ ﻛﺎﺋﻦ ﻋﺮﻓﻨﺎه ﻛﻤﺎ ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات وﻟﻜﻦ اﻻﺧﺘﻼف ﻫﻮ أﻧﻪ ﺑﻌﺪ‬
‫ﻋﻼﻣﺔ اﻟﻤﺴ ـﺎواة ﻧﻀ ـﻊ اﺳ ـﻢ اﻟﺼ ـﻨﻒ ‪ Class‬اﻟﺬي ﻳﺘﺒﻌﻪ اﻟﻜﺎﺋﻦ اﻟﺬي اﻧﺸ ـﺄﻧﺎه ‪،‬ﻳﻤﻜﻨﻚ أ ﻳﻀ ـﺎ‬
‫ﺗﻌﺮ ﻳﻒ أ ﻛﺜﺮ ﻣﻦ ﻛﺎﺋﻦ ﻟﻨﻔﺲ اﻟﺼﻨﻒ ﺑﺸﺮط أن ﻳﻜﻮن اﻻﺳﻢ ﻣﺨﺘﻠﻒ‪.‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﻮﺻﻮل إﻟﻰ اﻟﻤﺘﻐﻴﺮات اﻟﺨﺎﺻﺔ ﺑﺎﻟـ ‪Class‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪106‬‬


‫ﻃﺒﻌﺎ اﻵن ﺗﻌﺮف ﻟﺪﻳﻨﺎ ﻛﺎﺋﻦ ﻣﻦ ﺻـ ــ ـﻨﻒ اﻟﺴـ ــ ـﻴﺎرات إذا ﺟﻤﻴﻊ ﻣﺎ ﻋﺮﻓﻨﺎه ﻓﻲ داﺧﻞ ﺻـ ــ ـﻨﻒ‬
‫اﻟﺴـ ـــــ ـﻴﺎرة ﻳﻨﻄﺒﻖ ﺗﻤﺎﻣﺎ ﻋﻠﻰ اﻟﻜﺎﺋﻦ اﻟﺬي اﻧﺸـ ـــــ ـﺄﻧﺎه ﻣﻦ اﺳـ ـــــ ـﻢ وﻣﻮدﻳﻞ وﺳـ ـــــ ـﻌﺮ وﻟﻮن ‪ ،‬وﻫﻨﺎ‬
‫اﻟﺴﺆال ﻛﻴﻒ ﻧﺴﺘﺪﻋﻴﻬﻢ وﻧﻘﻮم ﺑﺘﻌﺒﺌﺘﻬﻢ ؟‬

‫"‪object1.name = "BMW‬‬
‫"‪object1.color = "White‬‬
‫‪object1.model = 2017‬‬
‫‪object1.price = 90872.87f‬‬

‫ﻛﻤﺎ ﻧﺮى ﻓﻲ ﻛﻞ ﻣﺮة ﻧﺮ ﻳﺪ اﻟﻮﺻﻮل إﻟﻰ ﻣﺘﻐﻴﺮ أو داﻟﺔ ﻓﻲ داﺧﻞ ‪ Class‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ‪:‬‬

‫‪Object .Attribute‬‬

‫وﻣﻦ ﺛﻢ ﻧﻘﻮم ﺑﺎﻟﺘﻌﺒﺌﺔ ﻛﻤﺎ ﻧﺮ ﻳﺪ‪.‬‬

‫ﺣﺴﻨﺎ اﻷن ﺗﻢ ﺗﻌﺒﺌﺔ ﺑﻴﺎﻧﺎت ﻫﺬا اﻟﻜﺎﺋﻦ ﺳﻨﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟﻄﺒﺎﻋﺔ ﻟﻨﺮى ﻣﺎ ﺳﻴﺤﺪث‪:‬‬

‫)‪println(object1.name‬‬
‫)‪println(object1.color‬‬
‫)‪println(object1.model‬‬
‫)‪println(object1.price‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪BMW‬‬
‫‪White‬‬
‫‪2017‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪107‬‬


‫‪90872.87‬‬

‫راﺑﻌﺎ ً ‪ :‬اﻟﻮﺻﻮل إﻟﻰ اﻟﺪوال اﻟﺨﺎﺻﺔ ﺑﺎﻟـ ‪Class‬‬

‫ﻣﻦ اﻟﻤﻤﻜﻦ ان ﻧﺴـ ــــــ ـﺘـﺪﻋﻴﻬـﺎ ﺑـﺪاﺧـﻞ ﻣﺘﻐﻴﺮ وﻣﻦ اﻟﻤﻤﻜﻦ اﺟﺮاء اﻣﺮ اﻟﻄﺒـﺎﻋـﺔ ﻣﺒـﺎﺷـ ــــــ ـﺮة‪،‬‬
‫ﺳﻮف ﻧﻘﻮم ﺑﺎﺗﺒﺎع ﻧﻔﺲ اﻟﻄﺮ ﻳﻘﺔ‪:‬‬

‫)‪var speed1 = object1.spead(150)println(speed1‬‬

‫ﺧﺎﻣﺴﺎ ً ‪ :‬ﺗﻤﺮﻳﺮ اﻟﻮﺳﺎﺋﻂ ﻓﻲ ‪Class‬‬

‫ﺑﺈﻣﻜﺎﻧﻨﺎ إﻧﺸﺎء ﺗﺼﻨﻴﻒ ‪ Class‬وﻧﻤﺮر ﻟﻪ وﺳﺎﺋﻂ ﻣﻌﻴﻨﻪ‪:‬‬

‫{ )‪class labtop(id:Int,name:String‬‬

‫‪var serialNum= id‬‬


‫‪var companyName = name‬‬

‫{)(‪fun getInfo‬‬
‫‪println("The labtop is : $companyName , and the serial number‬‬
‫)"‪is : $serialNum‬‬
‫}‬

‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪108‬‬


‫ﻧﻼﺣﻆ ﻗﻤﻨﺎ ﺑﺈﻧﺸـﺎء ﺗﺼـﻨﻴﻒ ‪class‬وﻣﺮرﻧﺎ ﻟﻪ وﺳـﺎﺋﻂ وﻫﺬا ﻳﻌﻨﻲ أﻧﻪ ﻋﻨﺪﻣﺎ ﻧﻘﻮم ﺑﺈﻧﺸـﺎء‬
‫ﻛﺎﺋﻦ ﻣﻦ ﻫﺬا اﻟﺘﺼ ـﻨﻴﻒ ﻳﺴ ـﺘﻮﺟﺐ ﻋﻠﻴﻨﺎ ﺗﻤﺮ ﻳﺮ ﻗﻴﻢ وﺳ ـﻨﺮى ذﻟﻚ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴ ـﻴﺔ ‪ ،‬وﻓﻲ‬
‫داﺧﻞ اﻟﺘﺼـ ــ ـﻨﻴﻒ ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮات واﺳـ ــ ـﻨﺪﻧﺎ ﻟﻬﺎ ﻗﻴﻢ ﻫﺬي اﻟﻮﺳـ ــ ـﺎﺋﻂ اﻟﻤﻤﺮرة وذﻟﻚ ﻷن ﻫﺬه‬
‫وﺳـ ـــﺎﺋﻂ ﺑﺪاﺧﻞ ﺗﺼـ ـــﻨﻴﻒ ﻟﻦ ﻳﺴـ ـــﺘﻄﻴﻊ اﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﻣﺒﺎﺷـ ـــﺮة ‪ ،‬وﻣﻦ ﺛﻢ ﻗﻤﻨﺎ ﺑﺈﻧﺸـ ـــﺎء داﻟﺔ‬
‫ﺗﻄﺒﻊ اﻟﻤﻌﻠﻮﻣﺎت‪.‬‬

‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬
‫{)>‪fun main (args:Array<String‬‬

‫)"‪var dell = labtop(1015,"Dell‬‬


‫)(‪dell.getInfo‬‬
‫}‬

‫ﻧﺮى أﻧﻪ أﻟﺰﻣﻨﺎ ﻋﻨﺪ إﻧﺸ ـﺎء اﻟﻜﺎﺋﻦ ﺑﺘﻤﺮ ﻳﺮ ﻗﻴﻢ ﻟﻬﺬه اﻟﻮﺳ ـﺎﺋﻂ اﻟﺘﻲ ادﺧﻠﻨﺎﻫﺎ ﻓﻲ اﻟﺘﺼ ـﻨﻴﻒ‬
‫ﻓﻮق‪.‬‬

‫ﻟﻮ ﻧﺮ ﻳﺪ أن ﻧﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻮﺳـ ــــ ـﺎﺋﻂ ﻣﺒﺎﺷـ ــــ ـﺮة ﺑﺪون ﺗﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮات ﻓﻲ داﺧﻞ ﺗﺼـ ــــ ـﻨﻴﻒ‬
‫‪:class‬‬

‫{ )‪class labtop(var id:Int,var name:String‬‬

‫{)(‪fun getInfo‬‬
‫)"‪println("The labtop is : $name , and the serial number is : $id‬‬
‫}‬

‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪109‬‬


‫ﻓﻘﻂ ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻔﻬﻢ ﺑﺪاﺧﻞ اﻗﻮاس اﻟﺘﺼﻨﻴﻒ‪.‬‬

‫ﺳﺎدﺳﺎ ً ‪ :‬ﻛﻠﻤﺔ ‪this‬‬

‫{ )‪class labtop(var id:Int,var name:String‬‬

‫{)‪fun setValues(id:Int , name:String‬‬


‫‪this.id = id‬‬
‫‪this.name = name‬‬
‫}‬

‫{)(‪fun getInfo‬‬
‫)"‪println("The labtop is : $name , and the serial number is : $id‬‬
‫}‬

‫}‬

‫ﺣﺴـ ــــــ ـﻨـﺎ اﻵن ﺳـ ــــــ ـﻨﺘﻌﺮف ﻋﻠﻰ ﻓـﺎﺋـﺪة ‪ this‬ﻧﻼﺣﻆ ﻫﻨـﺎ أن اﻧﺸـ ـــــــ ـﺄﻧـﺎ داﻟـﺔ وﻣﺮرﻧـﺎ ﻟﻬـﺎ ﻧﻔﺲ‬
‫اﻟﻤﺘﻐﻴﺮات ﻟﻠﺘﺼﻨﻴﻒ ‪ class‬وﺑﺪاﺧﻞ اﻟﺪاﻟﺔ‪:‬‬

‫‪this.id = id‬‬
‫‪this.name = name‬‬

‫ﻫﺬه اﻟﻜﻠﻤﺔ ﺗﻌﻨﻲ ‪ id‬اﻟﺨﺎص ﺑﺎﻟﺘﺼـ ـــــ ـﻨﻴﻒ وﻟﻴﺲ ‪ id‬اﻟﻤﻤﺮ ﻟﻠﺪاﻟﺔ ‪ ،‬ﻟﻮ ﻛﺎﻧﺖ اﻟﻤﺘﻐﻴﺮات‬
‫اﻟﻤﻤﺮرة ﻟﻠﺪاﻟﺔ ذات ﻣﺴـ ـــــ ـﻤﻴﺎت ﻣﺨﺘﻠﻔﺔ ﻋﻦ اﻟﺘﻲ ﺗﻢ ﺗﻤﺮ ﻳﺮﻫﺎ ﻟﻠﺘﺼـ ـــــ ـﻨﻴﻒ ﻓﻠﻦ ﻧﺤﺘﺎج ﻟﻬﺬه‬
‫اﻟﻜﻠﻤﺔ ‪ ،‬ﺑﺎﺧﺘﺼﺎر ﺷﺪﻳﺪ ﻛﻠﻤﺔ ‪ this‬ﺧﺎﺻﺔ ﻟﻠﻮﺻﻮل إﻟﻰ ﻣﺤﺘﻮﻳﺎت اﻟﺘﺼﻨﻴﻒ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪110‬‬


‫ﺳﺎﺑﻌﺎ ً ‪ :‬داﻟﺔ اﻟﺒﻨﺎء ‪constructor‬‬

‫ﻓﻲ اﻟﺒﺪا ﻳﺔ ﻻﺑﺪ ﻣﻦ ﺗﻮﺿﻴﺢ ﻣﺎﻫﻴﺔ داﻟﺔ اﻟﺒﻨﺎء وﻋﻤﻠﻬﺎ ؟‬

‫داﻟﺔ اﻟﺒﻨﺎء ﻫﻲ ﻋﺒﺎرة ﻋﻦ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻣﺒﺎﺷـ ــ ـﺮة ﻋﻨﺪ إﻧﺸـ ــ ـﺎء ﻛﺎﺋﻦ ﻣﺸـ ــ ـﺘﻖ‬
‫ﻣﻦ اﻟﺘﺼﻨﻴﻒ ‪،‬وﻳﻤﻜﻦ إﻧﺸﺎء أ ﻛﺜﺮ ﻣﻦ داﻟﺔ ﺑﻨﺎء ﺑﺪاﺧﻞ اﻟﺘﺼﻨﻴﻒ‬

‫ﻟﺪﻳﻨﺎ ﻃﺮ ﻳﻘﺘﺎن ﻟﻌﻤﻞ داﻟﺔ اﻟﺒﻨﺎء‪:‬‬

‫‪ v‬اﻟﻄﺮﻳﻘﺔ اﻷوﻟﻰ ‪ :‬داﻟﺔ ﺗﻌﺮﻳﻒ ﺟﺎﻫﺰة ‪init‬‬

‫• ﻫﺬه اﻟﺪاﻟﺔ اﺧﺘﺼﺎر ﻟﻜﻠﻤﺔ‪initialization .‬‬


‫• ﻻ ﻧﺴﺘﻄﻴﻊ ﺗﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮات ﺑﺪاﺧﻠﻬﺎ اﺑﺪا ً‪.‬‬
‫• ﻟﻬﺎ اﻷوﻟﻮﻳﺔ ﻓﻲ اﻟﺘﻨﻔﻴﺬ ﻟﻮ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء أ ﻛﺜﺮ ﻣﻦ داﻟﺔ ﺑﻨﺎء‪.‬‬
‫• ﻧﻘﻮم ﺑـﺪاﺧﻠﻬـﺎ ﺑﺘﻤﻬﻴـﺪ اﻟﻘﻴﻢ وﻋﻨـﺪ إﻧﺸـ ـــــــ ﺎء ﻛـﺎﺋﻦ ﻳﺘﻢ اﺳـ ــــــ ـﺘـﺪﻋـﺎﺋﻬـﺎ ﺗﻠﻘـﺎﺋﻴـﺎ ﺑـﺪون اﻟﻘﻴـﺎم‬
‫ﺑﻜﺘﺎﺑﺘﻬﺎ ﺑﻨﻔﺴﻚ وﺗﻨﻔﻴﺬ ﻣﺎ ﺑﺪاﺧﻠﻬﺎ‪.‬‬

‫§ ﻣﺜﺎل‬
‫‪class employee(var firstName:String,var lastName:String,var‬‬
‫{)‪titleJob:String,var salary :Double‬‬
‫{‪init‬‬
‫‪println("the name of employee is :$firstName $lastName, his title‬‬
‫)" ‪job :$titleJob ,and his salary :$salary‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪111‬‬


‫}‬

‫ﻓﻲ اﻟﻤﺜﺎل ﻋﺮﻓﻨﺎ اﻟﻤﺘﻐﻴﺮات ﺑﻴﻦ اﻗﻮاس اﻟﺘﺼـﻨﻴﻒ وﻣﻦ ﺛﻢ ﻧﻼﺣﻆ ﺑﺪاﺧﻞ ‪ init‬ﻓﻘﻂ ﻧﺮ ﻳﺪ‬
‫ﻫﺬا اﻟﺘﺼـ ــــــ ـﻨﻴﻒ ﺳـ ــــــ ـﻮف ﻳﻘﻮم ﺑﻮﺿـ ــــــ ـﻊ ﻗﻴﻢ‬
‫ﻫﺬه اﻟﺠﻤـﻠﺔ ‪ ،‬أي ﻋﻦ اﻧﺸـ ــــــ ـﺎء ـﻛﺎﺋﻦ ﻣﻦ ـ‬
‫ﻋﺔ ـ‬
‫ﻃـﺒﺎ ـ‬
‫ﻟﻠﻤﺘﻐﻴﺮات وﻋﻨﺪ ﺗﻨﻔﻴﺬ اﻟﺒﺮﻧﺎﻣﺞ ﺳﻴﻄﺒﻊ اﻟﺠﻤﻠﺔ اﻟﺘﻲ اردﻧﺎ ﻃﺒﺎﻋﺘﻬﺎ ﻓﻲ داﻟﺔ اﻟﺘﻬﻴﺌﺔ‪.‬‬

‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬
‫)‪var employee1 = employee("Ahmed","Aljuaid","Teacher",7000.0‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪the name of employee is :Ahmed Aljuaid, his title job :Teacher ,and‬‬
‫‪his salary :7000.0‬‬

‫‪ v‬اﻟﻄﺮﻳﻘﺔ اﻟﺜﺎﻧﻴﺔ ‪ :‬داﻟﺔ ‪constructor‬‬

‫ﻧﺴﺘﻄﻴﻊ ﺗﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮات ﺑﺪاﺧﻠﻬﺎ‪.‬‬

‫أ ﻳﻀـ ــ ـﺎ ﻧﻘﻮم ﺑﺪاﺧﻠﻬﺎ ﺑﺘﻤﻬﻴﺪ اﻟﻘﻴﻢ وﻋﻨﺪ إﻧﺸـ ــ ـﺎء ﻛﺎﺋﻦ ﻳﺘﻢ اﺳـ ــ ـﺘﺪﻋﺎﺋﻬﺎ ﺗﻠﻘﺎﺋﻴﺎ ﺑﺪون اﻟﻘﻴﺎم‬
‫ﺑﻜﺘﺎﺑﺘﻬﺎ ﺑﻨﻔﺴﻚ وﺗﻨﻔﻴﺬ ﻣﺎ ﺑﺪاﺧﻠﻬﺎ‪.‬‬

‫§ ﻣﺜﺎل‬

‫ﺳﻮف ﻧﻘﻮم ﺑﺘﻄﺒﻴﻖ ﻧﻔﺲ اﻟﻤﺜﺎل اﻟﻤﺬﻛﻮر ﻓﻲ ‪:init‬‬

‫{‪class employee‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪112‬‬


var firstName:String ? = null
var lastName:String ? = null
var titleJob:String ? = null
var salary :Double ? = null

constructor(fName:String,lName:String ,tJob:String ,sal :Double){


firstName = fName
lastName = lName
titleJob = tJob
salary = sal
println("the name of employee is :$firstName $lastName, his
title job :$titleJob ,and his salary :$salary ")
}
}

‫ﻗﻤﻨﺎ ﺑﺘﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮات ﺑﺪاﺧﻞ اﻟﺘﺼـ ـــــ ـﻨﻴﻒ وﻣﻦ ﺛﻢ اﻧﺸـ ـــــ ـﺄﻧﺎ داﻟﺔ ﺑﻨﺎء ﺗﻤﺮر ﻟﻬﺎ ﻣﺘﻐﻴﺮات‬
.‫وﻗﻤﻨﺎ ﺑﺈﺳﻨﺎد ﻫﺬه اﻟﻤﺘﻐﻴﺮات وﻣﻦ ﺛﻢ أﻣﺮ اﻟﻄﺒﺎﻋﺔ‬

‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬
var employee1 = employee("Ahmed","Aljuaid","Teacher",7000.0)

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
the name of employee is :Ahmed Aljuaid, his title job :Teacher ,and
his salary :7000.0

‫ﺗﻨﻮﻳﻪ‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 113 ‫اﻟﺼﻔﺤﺔ‬


‫ﻟﻮ أردﻧﺎ ﺗﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮات ﻋﻨﺪ إﻧﺸـﺎء اﻟﺘﺼـﻨﻴﻒ ﻓﺪاﻟﺔ اﻟﺒﻨﺎء اﻟ ـ ــــــ ـ ‪ constructor‬ﻻ ﻧﺴـﺘﻄﻴﻊ‬
‫اﻟﺘﻤﺮ ﻳﺮ ﻟﻬﺎ وﻟﻜﻦ ﻧﺴﺘﻌﻴﺾ ﻋﻨﻬﺎ ﺑﻔﻌﻞ اﻷﺗﻲ‪:‬‬

‫‪class employee (var firstName:String,var lastName:String,var‬‬


‫{)‪titleJob:String,var salary :Double‬‬

‫{)‪constructor():this("Ahmed","Aljuaid","Teacher",7000.0‬‬

‫‪println("the name of employee is :$firstName $lastName, his title‬‬


‫)" ‪job :$titleJob ,and his salary :$salary‬‬

‫}‬

‫}‬

‫ﻧﻼﺣﻆ أﻧﻨﺎ اﺳـ ـﺘﻌﻤﻠﻨﺎ ﻛﻠﻤﺔ ‪ this‬اﻟﺘﻲ ﺗﻘﻮم ﺑﺎﻟﻮﺻـ ـﻮل إﻟﻰ اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﻋﺮﻓﻨﺎﻫﺎ ﻋﻨﺪ‬
‫إﻧﺸﺎء اﻟﺘﺼﻨﻴﻒ‪.‬‬

‫وﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ ﻧﻘﻮم ﻓﻘﻂ ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﺑﺪون ﺗﻤﺮ ﻳﺮ‪:‬‬

‫)(‪var employee1 = employee‬‬

‫ﺗﺘﻨﻮع ﻫﺬه اﻟﻄﺮق وﻛﻼ ً ﺑﺤﺴﺐ ﺣﺎﺟﺘﻚ أﻧﺖ ﻋﻨﺪ إﻧﺸﺎء اﻟﺒﺮﻧﺎﻣﺞ وﺑﺤﺴﺐ ﻣﺎ ﺗﺮاه‪.‬‬

‫‪Inheritance‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪114‬‬


‫ﻟﻮ ﺗﻜﻠﻤﻨﺎ ﻋﻠﻤﻴﺎ ً ﺑﻬﺬا اﻟﻤﻮﺿـ ـــﻮع واردﻧﺎ ﺗﺒﺴـ ـــﻴﻂ ﻣﻔﻬﻮم اﻟﻮراﺛﺔ ﺳـ ـــﻨﻘﻮل أن ﺗﻨﺘﻘﻞ ﺑﻌﺾ‬
‫ﻣﻦ ﺻـ ـــ ـﻔﺎت اﻟﻮاﻟﺪﻳﻦ أو ﺟﻤﻴﻌﻬﺎ ﻟﻠﻄﻔﻞ ‪ ،‬وﻧﻔﺲ اﻟﺸـ ـــ ـﻲء ﻳﺤﺪث ﺑﺮﻣﺠﻴﺎ ﻧﺴـ ـــ ـﺘﻄﻴﻊ إﻧﺸـ ـــ ـﺎء‬
‫ﺗﺼﻨﻴﻒ ‪ class‬ﻳﺮث ﻣﻦ ﺗﺼﻨﻴﻒ ‪ class‬أﺧﺮ‪.‬‬

‫أوﻻ ‪ :‬ﻣﻔﺎﻫﻴﻢ ﻣﺘﻌﻠﻘﺔ ﺑﺎﻟﻮراﺛﺔ‬

‫ﺳﻨﺘﻌﺮف ﻋﻠﻰ ﻃﺮ ﻳﻘﺔ اﻟﻮراﺛﺔ ﺑﺮﻣﺠﻴﺎ وﻟﻜﻦ ﺑﻌﺪ ﺗﻮﺿﻴﺢ ﺑﻌﺾ اﻟﻤﻔﺎﻫﻴﻢ اﻟﻌﺎﻣﺔ ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬

‫ﻓﻠﻨﻔﺘﺮض أن ﻟﺪﻳﻨﺎ ‪ class Person‬ﻳﺤﺘﻮي ﻋﻠﻰ اﻻﺗﻲ ‪:‬‬

‫} اﺳـﻢ اﻟﺸـﺨﺺ – ﺗﺎر ﻳﺦ اﻟﻤﻴﻼد – اﻟﺮﻗﻢ اﻟﻤﺪﻧﻲ {‪ ،‬واﻧﺸـﺄﻧﺎ ‪ class Employee‬ﻳﺮث ﻣﻦ‬
‫‪class Person‬ﻳﺤﺘﻮي ﻋﻠﻰ اﻻﺗﻲ ‪ } :‬اﻟﺮﻗﻢ اﻟﻮﻇﻴﻔﻲ { ‪ ،‬ﻓﻬﻨﺎ ‪ class Employee‬ﻳﺴـ ـــــ ـﺘﻄﻴﻊ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪115‬‬


‫اﻟﻮﺻـ ـﻮل إﻟﻰ ﻣﺤﺘﻮﻳﺎت ‪ class Person‬ﻣﻦ اﻻﺳـ ـﻢ وﺗﺎر ﻳﺦ اﻟﻤﻴﻼد واﻟﺮﻗﻢ اﻟﻤﺪﻧﻲ ﺑﺎﻹﺿـ ـﺎﻓﺔ‬
‫إﻟﻰ ﻣﺎ ﻳﺘﻀﻤﻨﻪ ﻫﺬا اﻟﺘﺼﻨﻴﻒ ﻣﻦ اﻟﺮﻗﻢ اﻟﻮﻇﻴﻔﻲ‪.‬‬

‫ﺣﺴـ ــــ ـﻨﺎ ً ﻧﻜﻤﻞ اﻟﺸـ ــــ ـﺮح وﻧﻼﺣﻆ أن اﻟﻮﻇﺎﺋﻒ أﻧﻮاع ﻓﻠﺪﻳﻨﺎ اﻟﻤﻌﻠﻢ وﻟﺪﻳﻨﺎ اﻟﻤﻬﻨﺪس وﻟﺪﻳﻨﺎ‬
‫ﻤﺎ أﻧﻬﻢ‬
‫ﻫﺎ اﻟﻜﺜﻴﺮ وﺟﻤﻴﻌﻬﻢ ﻳﺮﺛﻮن ﻣﻦ ‪ class Employee‬وـﺑﺎﻟﻄﺒﻊ ـﻳﺎ ﻋﺰ ﻳﺰي ﺑ ـ‬
‫اﻟﻄﺒﻴـﺐ وﻏﻴﺮ ـ‬
‫ﻳﺮﺛﻮن ﻣﻨﻪ وﻫﻮ ﺑﺪوره ﻳﺮث ﻣﻦ ‪ class Person‬ﻓﻬﻢ ﻳﺴـ ــــ ـﺘﻄﻴﻌﻮن اﻟﻮﺻـ ــــ ـﻮل إﻟﻰ ﻣﺤﺘﻮﻳﺎت‬
‫‪class Person‬أ ﻳﻀـﺎ ً ‪ ،‬ﻫﺬا اﻟﺸـﻲء ﻳﺸـﺒﻪ ﻛﺜﻴﺮا ﻣﺎ ﺗﻘﺪم ﺷـﺮﺣﻪ ﻓﻲ اﻟﺘﻤﻬﻴﺪ ﻓﻮق ﺑﺄن اﻟﻄﻔﻞ‬
‫ﻳﺴـﺘﻄﻴﻊ أن ﻳﺮث ﻣﻦ واﻟﺪﻳﻪ وﻟﻜﻦ ﻫﻞ ﻓﻘﻂ واﻟﺪﻳﻪ ؟ ﻻ أ ﻳﻀـﺎ ﻗﺪ ﻳﺮث ﻣﻦ ﺟﺪﻳﻪ ﺻـﻔﺎت‪ .‬إذا‬
‫ﻧﺤﻦ اﻷن ﻧﻌﻠﻢ أن ﻓﻲ اﻟﻮراﺛﺔ ﻧﺴﺘﻄﻴﻊ اﻟﻮﺻﻮل إﻟﻰ ﻛﺎﻓﺔ ﻣﺤﺘﻮﻳﺎت ‪class‬اﻟﻤﻮروث‪.‬‬

‫ﻣﻦ ﻫﻮ اﻟﻮارث وﻣﻦ ﻫﻮ اﻟﻤﻮروث ؟‬


‫اﻟﻤﻮروث ﻓﻲ اﻟﻤﺜ ـﺎل أﻋﻼه ﻫﻮ ‪ class person‬ﻫﻮ اﻷب ﻳﻌﺘﺒﺮ وﻧﻄﻠﻖ ﻋﻠﻴ ـﻪ ‪ ، super‬أﻣ ـﺎ‬
‫اﻟﻮارث ﻓﻬﻮ ‪ class Employee‬وﻧﺴ ـ ـ ـ ـ ـﻤﻴـ ـﻪ ‪ sub‬أي ﻓﺮﻋﻲ‪ .‬وﺑـ ـﺎﻟﻄﺒﻊ اﻟﻤﻌﻠﻢ واﻟﻄﺒﻴـ ـﺐ‬
‫واﻟﻤﻬﻨــﺪس ﻳﻌﺘﺒﺮون وارﺛﻴﻦ وﻳﻌﺘﺒﺮون ‪ ،sub‬واﻟﻤﻮروث ﻫﻮ ‪ class Employee‬اﻟــﺬي‬
‫ﻳﻌﺪ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻬﻢ ‪.super‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﻟﻮراﺛﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ‬

‫اﻟﺘﺼـﻨﻴﻒ اﻷب أو ‪ super class‬ﻟﻜﻲ ﻧﺴـﺘﻄﻴﻊ أن ﻧﺠﻌﻞ ﺗﺼـﻨﻴﻒ أﺧﺮ ﻳﺮث ﻣﻨﻪ ﻻﺑﺪ ﻣﻦ‬
‫وﺿﻊ ﻛﻠﻤﺔ ‪ open‬ﻋﻨﺪ إﻧﺸﺎﺋﻪ‪.‬‬

‫‪ v‬ﻣ ﺜﺎل‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪116‬‬


§ super class
open class person(){
var name:String? = null
var id :Int? = null

fun getInfo(){
println("The name is :$name your Id is : $id")
}

fun getId(id:Int){
println("your id is :$id")

}
}

‫إذا ﻧﻼﺣﻆ أﻧﻪ ﺗﺼـ ــــ ـﻨﻴﻒ ﻋﺎدي ﻗﻤﻨﺎ ﺑﺈﻧﺸـ ــــ ـﺎﺋﻪ ﻛﻤﺎ ﺗﻌﻠﻤﻨﺎ وﻟﻜﻦ ﻷن ﻫﻨﺎك ﺗﺼـ ــــ ـﻨﻴﻒ أﺧﺮ‬
.‫ﺳﻴﺮث ﻣﻨﻪ ﻓﻴﺠﺐ ﻋﻠﻴﻨﺎ ﺟﻌﻠﻪ ﻣﻔﺘﻮح ﻟﻴﺴﺘﻄﻴﻊ اﻟﻮارث أن ﻳﺼﻞ ﻟﻤﺤﺘﻮﻳﺎت ﻫﺬا اﻟﺘﺼﻨﻴﻒ‬

:‫أﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺘﺼﻨﻴﻒ اﻟﻮارث ﻓﻌﻠﻰ ﻫﺬا اﻟﻨﺤﻮ ﻳﺘﻢ ﻛﺘﺎﺑﺘﻪ‬

§ sub class
class Employee(): person()
{
var idj :Int?=null

fun printAllData(){
println("the ID for your job : $idj")
}

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 117 ‫اﻟﺼﻔﺤﺔ‬


‫}‬

‫ﻋﻨﺪ إﻧﺸـﺎء اﻟﺘﺼـﻨﻴﻒ ﻧﻘﻮم ﻓﻮرا ﺑﻌﻤﻠﻴﺔ اﻟﻮراﺛﺔ )(‪ class Employee(): person‬ﻧﻘﻄﺘﻴﻦ‬
‫رأﺳﻴﺘﻴﻦ وﻣﻦ ﺛﻢ اﺳﻢ اﻟﺘﺼﻨﻴﻒ اﻟﻤﻮروث‪.‬‬

‫‪ v‬ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

‫ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﻣﻦ ‪ class Employee‬وذﻟﻚ ﻟﺘﻮﺿﻴﺢ ﻛﻴﻒ ﺗﺘﻢ ﻋﻤﻠﻴﺔ اﻟﻮراﺛﺔ‪:‬‬

‫ﻧﺮى أن اﻟﻜﺎﺋﻦ اﻟﻤﺸـﺘﻖ ﻣﻦ ‪ class Employee‬اﺳـﺘﻄﺎع اﻟﻮﺻـﻮل إﻟﻰ ﻣﺤﺘﻮﻳﺎت ‪class‬‬


‫‪Person‬وﻫـﺬا اﻟﻐﺮض اﻟﺮﺋﻴﺴـ ــــــ ـﻲ ﻣﻦ ﻋﻤﻠﻴـﺔ اﻟﻮراﺛـﺔ أن اﻟﻜـﺎﺋﻦ ﻳﺴـ ــــــ ـﺘﻄﻴﻊ اﻟﻮﺻـ ــــــ ـﻮل إﻟﻰ‬
‫ﻣﺤﺘﻮﻳﺎت‪.super class‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻮﺳﺎﺋﻂ اﻟﻤﻤﺮرة ﻟﻠﺘﺼﻨﻴﻒ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪118‬‬


‫ﻟﻮ ﻛﺎن ‪ class Person‬ﻣﻤﺮر ﻟﻪ وﺳ ـﺎﺋﻂ وﻫﺬا اﻟﺸ ـﻲء ﻃﺒﻴﻌﻲ ﻛﻤﺎ ﺗﻌﺮﻓﻨﺎ ﻋﻠﻴﻪ ﻣﺴ ـﺒﻘﺎ‬
‫ﻋﻨﺪ إﻧﺸﺎء ﺗﺼﻨﻴﻒ ‪ ،‬ﻛﻴﻒ ﺳﻨﺘﻌﺎﻣﻞ ﻣﻌﻪ ﻓﻲ اﻟﻮراﺛﺔ ؟‬

‫اﻟﺠﻮاب ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬

‫• ﻧﻘﻮم ﺑﺈﻧﺸـ ــ ـﺎء ت اﻟﺘﺼـ ـ ـﻨﻴﻒ اﻟﻤﻮروث او ﻣﺎ ﻧﺴـ ـ ـﻤﻴﻪ ﺑـ ـ ـ ـ ـ ـ ـ ـ ‪ super class‬وﻧﻤﺮر ﻟﻪ‬
‫وﺳﺎﺋﻂ‪ .‬ﻣﺜﺎل‪:‬‬

‫{)‪open class person(id :Int , name :String‬‬

‫‪var id:Int = id‬‬


‫‪var name :String = name‬‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫}‬

‫• ﻧﻘﻮم ﺑﺈﻧﺸﺎء ‪ sub class‬وﻧﻤﺮر ﻟﻪ أ ﻳﻀﺎ ﻧﻔﺲ اﻟﻮﺳﺎﺋﻂ اﻟﺬي ﺳﻴﺮﺛﻬﺎ‪ .‬ﻣﺜﺎل‪:‬‬

‫)‪class Employee(id :Int , name :String) : person(id , name‬‬


‫{‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪119‬‬


‫ﻧﻼﺣﻆ ﻣﺮرﻧﺎ ﻧﻔﺲ اﻟﻮﺳـ ـﺎﺋﻂ ﻟﻠﺘﺼـ ـﻨﻴﻒ اﻟﺬي ﺳـ ـﻴﺮث وﻣﻦ ﺛﻢ وﺿـ ـﻌﻨﺎ اﺳـ ـﻢ اﻟﺘﺼـ ـﻨﻴﻒ‬
.‫اﻟﻤﻮروث وﻣﺮرﻧﺎ اﻟﻤﺘﻐﻴﺮات ﺑﺸﻜﻞ ﻃﺒﻴﻌﻲ ﺑﺪون ﺗﻌﺮ ﻳﻒ ﻟﻬﺎ أو ﻟﻨﻮﻋﻬﺎ‬

:‫ داﻟﺔ ﺑﻨﺎء‬constructor ‫ﺣﺴﻨﺎ ﻧﻔﺲ اﻟﺸﻲء ﻳﻨﻄﺒﻖ ﻟﻮ ﻛﺎن ﻟﺪي‬

§ super class
open class person{

var id:Int? = null


var name :String? = null

constructor(id:Int,name:String){
this.id = id
this.name=name
}

§ sub class
class Employee : person
{
constructor(id:Int,name:String):super(id , name){

this.id = id
this.name=name
}
}

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 120 ‫اﻟﺼﻔﺤﺔ‬


‫وﻧﻼﺣﻆ ﻫﻨﺎ أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺎﺳـ ـﺘﺨﺪام ﻛﻠﻤﺔ ‪ super‬ﻟﻴﺘﻀـ ـﺢ ﻟﻨﺎ أﻧﻬﺎ ‪ keywords‬ﻓﻲ ﻟﻐﺔ اﻟ ـ ـــــــــ ـ‬
‫‪ ،kotlin‬وﻧﻘﺼﺪ ﺑﻬﺎ ﻫﻨﺎ اﻟﻮﺻﻮل إﻟﻰ داﻟﺔ اﻟﺒﻨﺎء اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﺼﻨﻴﻒ اﻷب‪.‬‬

‫راﺑﻌﺎ ‪ :‬اﻟﻔﺮق ﺑﻴﻦ ‪ this‬و ‪super‬‬

‫اﻟﻔﺮق ﺑﺴﻴﻂ ﺟﺪا ً ‪:‬‬

‫ﻧﺴﺘﺨﺪم ‪ this‬ﻓﻲ اﻟﺘﺼﻨﻴﻒ ﻧﻔﺴﻪ وﻟﻠﺘﻌﺒﻴﺮ ﻋﻦ ﻣﺤﺘﻮﻳﺎﺗﻪ ﻛﻤﺎ ﺗﻌﻠﻤﻨﺎ ﻣﺴﺒﻘﺎ ً‪.‬‬

‫ﻧﺴـ ـــــ ـﺘﺨﺪم ‪ super‬ﻟﻠﻮﺻـ ـــــ ـﻮل إﻟﻲ ﻣﺤﺘﻮﻳﺎت اﻟﺘﺼـ ـــــ ـﻨﻴﻒ اﻷب أي أﻧﻪ ﺧﺎص ﺑﺎﻟﺘﺼـ ـــــ ـﻨﻴﻒ‬
‫اﻟﻤﻮروث ﻟﻠﻮﺻﻮل إﻟﻴﻪ‪.‬‬

‫‪interface‬‬

‫أوﻻ ً ‪ :‬ﺗﻤﻬﻴﺪ‬

‫ﻫﻞ ﻗﺪ ﺧﻄﺮ ﻓﻲ ﺑﺎﻟﻚ أﺛﻨﺎء ﺗﺼــﻤﻴﻢ ﻣﺸــﺮوﻋﻚ أﻧﻚ ﺗﻌﻠﻦ ﻋﻦ داﻟﺔ وﻟﻜﻦ ﻻ ﺗﻌﻠﻢ ﻣﺎ ﻟﺬي‬
‫ﺳـﺘﻀـﻌﻪ ﺑﺪاﺧﻠﻬﺎ أو أﻧﻚ ﺗﺮ ﻳﺪ اﻹﻋﻼن ﻓﻘﻂ وﺳـﺘﺴـﺘﺨﺪﻣﻬﺎ ﻻﺣﻘﺎ ً ؟ ﻓﻲ ﺑﻴﺌﺔ ‪ Kotlin‬ﻧﺴـﺘﻄﻴﻊ‬
‫ﻫﺬه اﻟﻌـﻨﺎﺻـ ــــــ ـﺮ ﺗﻤﻜﻨﻲ ﻣﻦ اﻹﻋﻼن ﻋﻦ‬
‫ﻣﺎ ‪ abstract‬أو ‪ ، interface‬ـ‬
‫ﻌﻞ ذـﻟﻚ ﻋﻦ ﻃﺮ ﻳﻖ إ ـ‬
‫ﻓ ـ‬
‫ﻣﺘﻐﻴﺮات ودوال ﺑـﺪون أن أ ﻛﺘـﺐ ﻗﻄﻊ ﺑﺮﻣﺠﻴـﺔ ﺑﻤﻌﻨﻰ أﻧﻲ ﻓﻘﻂ أﻋﺮف ﻋﻦ داﻟـﺔ وﻟﻜﻨﻲ ﻣـﺎ‬
‫ﺗﺘﻀﻤﻨﻪ ﻫﺬه اﻟﺪاﻟﺔ ﺳﺄؤﺟﻞ ﻛﺘﺎﺑﺘﻪ إﻟﻰ ﺣﻴﻦ أﺣﺘﺎﺟﻪ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪121‬‬


‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﻟﺘﻌﺮﻳﻒ ﻋﻦ ‪interface‬‬

‫ﻛﻤﺎ ﻗﻠﻨﺎ ﺳﺎﺑﻘﺎ ﻧﺴﺘﻄﻴﻊ ﻓﻴﻪ اﻹﻋﻼن ﻋﻦ اﻟﺪوال اﻟﺘﻲ ﺳﺄﺳﺘﺨﺪﻣﻬﺎ ﻻﺣﻘﺎ ً‪.‬‬

‫{‪interface myInterface‬‬

‫}‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻹﻋﻼن ﻓﻲ ‪interface‬‬

‫ﺳﻨﻮﺿﺢ اﻷن ﻛﻴﻔﻴﺔ ﺗﺠﻬﻴﺰ اﻟﻤﺘﻐﻴﺮات واﻻﻋﻼن ﻋﻨﻬﺎ وﻋﻦ اﻟﺪوال‪:‬‬

‫{‪interface myInterface‬‬

‫)(‪fun sum‬‬
‫)(‪fun sub‬‬
‫{)‪fun mul(num1:Int,num2:Int‬‬
‫‪var result = num1*num2‬‬
‫}‬
‫‪var num1:Int‬‬

‫}‬

‫اﻋﻠﻨﺎ ﻋﻦ داﻟﺔ ﺟﻤﻊ وﻟﻜﻦ ﺑﺪون أن ﻧﺒﻨﻲ اﻟﻘﻄﻌﺔ اﻟﺒﺮﻣﺠﻴﺔ اﻟﺨﺎﺻﺔ ﺑﻬﺎ‪.‬‬

‫أ ﻳﻀﺎ اﻋﻠﻨﺎ ﻋﻦ داﻟﺔ اﻟﻄﺮح وﻟﻢ ﻧﺴﺘﺨﺪﻣﻬﺎ أ ﻳﻀﺎ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪122‬‬


‫اﻋﻠﻨ ـﺎ ﻋﻦ داﻟ ـﺔ اﻟﻀـ ــــــ ـﺮب وﻗﻤﻨ ـﺎ ﺑﺒﻨ ـﺎﺋﻬ ـﺎ وﺗﻤﺮ ﻳﺮ ﻗﻴﻢ ووﺿـ ــــــ ـﺤﻨ ـﺎ ﻋﻤﻠﻬ ـﺎ وﻫ ـﺬا ﻳ ـﺪل ان‬
‫‪interface‬ﻟﻴﺲ ﺣﻜﺮا ﻓﻘﻂ ﻟﺘﺠﻬﻴﺰ اﻟـﺪوال واﻟﻤﺘﻐﻴﺮات أ ﻳﻀـ ــــــ ـﺎ ﻧﺴـ ــــــ ـﺘﻄﻴﻊ ﺑﻨـﺎء داﻟـﺔ ﻛـﺎﻣﻠـﺔ‪،‬‬
‫وﻟﻜﻦ اﻻﺧﺘﻼف ﻳﻜﻤﻦ ﻓﻲ ﻃﺮ ﻳﻘﺔ اﻟﻌﻤﻞ اﻟﺘﻲ ﺳﻨﻮﺿﺤﻬﺎ ﺑﻌﺪ ﻗﻠﻴﻞ‪.‬‬

‫اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﻳﺘﻢ ﺗﻌﺮ ﻳﻔﻬﺎ ﺑﺪاﺧﻞ ‪ interface‬ﻻ ﻳﺘﻢ اﺳـ ـــــ ـﻨﺎد ﻗﻴﻢ ﻟﻬﺎ اﺑﺪا ‪ ،‬ﻛﻤﺎ ﻻﺣﻈﻨﺎ‬
‫ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ وﻟﻢ ﻧﺴﻨﺪ ﻟﻪ ﻗﻴﻢ‪.‬‬

‫راﺑﻌﺎ ً ‪ :‬اﺳﺘﺨﺪام ‪interface‬‬

‫‪ Interface‬ﻻ ﻳﺘﻢ اﺳـ ــــ ـﺘﺨﺪاﻣﻬﺎ ﻣﺒﺎﺷـ ــــ ـﺮة ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴـ ــــ ـﻴﺔ وإﻧﻤﺎ ﻧﺴـ ــــ ـﺘﺨﺪﻣﻬﺎ ﺑﻌﻤﻠﻴﺔ‬
‫‪implements‬وﻫﻲ ﺑﺎﻟﻀﺒﻂ ﻣﻤﺎﺛﻠﺔ ﻟﻌﻤﻠﻴﺔ اﻟﻮراﺛﺔ‪ ،‬ﻫﻜﺬا‪:‬‬

‫ﻧﺮى أﻧﻪ ﻋﻨﺪﻣﺎ ﺟﻌﻠﻨﺎ اﻟﺘﺼ ـﻨﻴﻒ ﻳﺮث ﻣﻦ اﻟ ـ ـــــــ ـ ‪ interface‬ﻗﺎم ﺑﻮﺿـﻊ ﺧﻂ اﺣﻤﺮ ‪ ،‬ﻟﻤﺎذا ؟‬
‫ﻌﺪ ـﻓﺈﺟـﺒﺎري أن‬
‫ﻌﻞ اﻟﺘﺼـ ــــــ ـﻨﻴﻒ ﻳﺮث ﻣﻦ ‪ interface‬وـﺑﺪاﺧـﻠﻪ دوال ﻟﻢ ﺗﺒﻨﻰ ﺑ ـ‬
‫ﻣ ﺎ ﺗﺠ ـ‬
‫ﻷـﻧﻪ ﻋﻨـﺪ ـ‬
‫ﺗﺪرﺟﻬﻢ ﺑﺪاﺧﻞ اﻟﺘﺼـ ـــــ ـﻨﻴﻒ ﻛﻠﻬﻢ أو أﺣﺪﻫﻢ ﻋﻠﻰ اﻷﻗﻞ‪ ،‬ﺣﺴـ ـــــ ـﻨﺎ وﻟﻜﻦ ﻛﻴﻒ ﻳﻌﻨﻲ ادرﺟﻬﻢ ؟‬
‫ﺑﻤﻌﻨﻰ أن ﺗﻘﻮم ﺑﻌﻤﻞ ‪ override‬ﻟﻠﺪاﻟﺔ ﻛﻤﺎ ﺗﻌﻠﻤﻨﺎ ﻣﺴﺒﻘﺎ‪ ،‬ﺳﻨﻮﺿﺢ ذﻟﻚ اﻷن‪:‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪123‬‬


‫• ﺑﻌﺪ اﻟﻀـﻐﻂ ﻋﻠﻴﻬﺎ ﻧﻼﺣﻆ أن ﻳﻄﻠﺐ‪implement as constructor parameters‬‬
‫ﻓﻲ أول ﻣﺮة وﻳﻘﺼـ ـــ ـﺪ ﺑﻪ أﻧﻨﺎ ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ ﻓﻲ ‪ interface‬ﻓﻬﻨﺎ ﻳﺠﺐ ﻓﻲ اﻟﺘﺼـ ـــ ـﻨﻴﻒ‬
‫اﻟﻮارث ان ﻧﺴﺘﺨﺪﻣﻪ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪124‬‬


‫ﺑﻌﺪ إدراج اﻟﻤﺘﻐﻴﺮ‪:‬‬

‫{‪class operations(override var num1: Int) :myInterface‬‬

‫}‬
‫• ‪ implement members‬وﻫﻮ ﻳﻌﻨﻲ ﻗﻢ ﺑﺈﺿـ ـﺎﻓﺔ اﻟﺪوال اﻟﺘﻲ ﻋﺮﻓﺘﻬﺎ وﻟﻢ ﺗﺴـ ـﺘﺨﺪﻣﻬﺎ ‪،‬‬
‫وﻫﻨـﺎ ﻧﻨﻮه ﺑـﺄﻧـﻪ إﺟﺒـﺎري اﺳـ ــــــ ـﺘﺨـﺪاﻣﻬـﺎ وﻛﺘـﺎﺑﺘﻬـﺎ ﺑﻤـﺎ أﻧـﻚ ﻗﻤـﺖ ﺑﺠﻌـﻞ اﻟﺘﺼـ ــــــ ـﻨﻴﻒ ﻳﺮث‬
‫ﻣﻦ ‪ ،interface‬أﻣﺎ اﻟﺪاﻟﺔ اﻟﺠﺎﻫﺰة اﻟﺨﺎﺻـﺔ ﺑﻌﻤﻠﻴﺔ اﻟﻀـﺮب ﻓﻨﺤﻦ ﺑﻨﻴﻨﺎﻫﺎ ﻓﻲ ‪interface‬‬
‫ﻓﻠﻚ اﻟﺤﺮ ﻳﺔ ﺑﺄن ﺗﺴﺘﺪﻋﻴﻬﺎ ﻓﻲ اﻟﺘﺼﻨﻴﻒ أو ﻻ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪125‬‬


:‫ﺑﻌﺪ إدراج اﻟﺪوال‬

class operations(override var num1: Int) :myInterface{


override fun sub() {
TODO("not implemented") //To change body of created functions
use File | Settings | File Templates.
}

override fun sum() {

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 126 ‫اﻟﺼﻔﺤﺔ‬


TODO("not implemented") //To change body of created functions
use File | Settings | File Templates.
}

interface ‫ ﻣﺜﺎل‬: ً ‫ﺧﺎﻣﺴﺎ‬

interface myInterface{

fun sum(num1:Int,num2:Int)
fun sub(num1:Int,num2:Int)
fun mul(num1:Int,num2:Int){
var result = num1*num2
println("the result :$result")
}

class operations:myInterface{
override fun sub(num1:Int,num2:Int) {
var result = num1 - num2
println("the result :$result")
}

override fun sum(num1:Int,num2:Int) {


var result = num1 + num2
println("the result :$result")
}

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 127 ‫اﻟﺼﻔﺤﺔ‬


fun dev(num1:Int,num2:Int){
var result = num1 / num2
println("the result :$result")
}

fun main(args:Array<String>){
var op1 = operations()
println("the result of sum :")
op1.sum(4,3)
println("the result of sub :")
op1.sub(4,3)
println("the result of mul :")
op1.mul(3,4)
println("the result of dev :")
op1.dev(4,3)
}

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
the result of sum :
the result :7
the result of sub :
the result :1
the result of mul :
the result :12
the result of dev :
the result :1

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 128 ‫اﻟﺼﻔﺤﺔ‬


‫‪abstract‬‬

‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم اﻟـ ‪abstract‬‬

‫ﻧﺴـ ــــــ ـﺘﻄﻴﻊ ﻓﻴـﻪ ﺟﻌـﻞ اﻟـﺪوال واﻟﻤﺘﻐﻴﺮات ﻣﻌﻠﻨـﺔ ﻓﻘﻂ وﻟﻜﻦ ﺑﺸـ ــــــ ـﺮط أن ﻧﻀـ ــــــ ـﻊ ﻛﻠﻤـﺔ‬
‫‪abstract‬أﻣﺎﻣﻬﺎ ‪ ،‬ﺑﻤﻌﻨﻰ أن اﻟﺪوال ﻓﻲ ‪ interface‬ﻛﻨﺎ ﻧﺴـ ــــ ـﺘﻄﻴﻊ أن ﻧﻌﻠﻦ ﻋﻨﻬﺎ ﻓﻘﻂ ﺑﺪون‬
‫أن ﻧﻨﺸـ ــ ـﺊ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﻟﻬﺎ ﻷﻧﻨﺎ ﺳـ ــ ـﻨﻘﻮم ﺑﺬﻟﻚ ﻓﻲ ﺗﺼـ ــ ـﻨﻴﻒ أﺧﺮ ‪ ،‬ﻫﻨﺎ أ ﻳﻀـ ــ ـﺎ ﻧﺴـ ــ ـﺘﻄﻴﻊ أن‬
‫ﻧﻌﻠﻦ ﻓﻘﻂ ﻋﻦ اﻟﺪاﻟﺔ ﺑﺪاﺧﻞ ﻫﺬا اﻟﺘﺼـ ــــ ـﻨﻴﻒ وﻟﻜﻦ ﻳﺸـ ــــ ـﺘﺮط أن ﻧﻀـ ــــ ـﻊ ﻛﻠﻤﺔ ‪ abstract‬ﻷن‬
‫اﻟﺘﺼﻨﻴﻒ أﺻﻼ ﻫﻮ‪abstract .‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﺳﺘﺨﺪام اﻟـ ‪abstract‬‬

‫ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺗﺼـ ــــ ﻨﻴﻒ ‪ class‬وﻟﻜﻨﻪ ﻻ ﻳﻘﺒﻞ أن ﻧﻨﺸـ ــــ ﺊ ﻣﻨﻪ ﻛﺎﺋﻦ ‪ ،‬ﺗﺼـ ــــ ﻨﻴﻒ ﻧﺼـ ــــ ﻤﻤﻪ‬
‫ﻟﻠﻮراﺛﺔ )أي ﻟﻨﺠﻌﻞ ﺟﻤﻴﻊ ﻣﺤﺘﻮﻳﺎﺗﻪ ﻗﺎﺑﻠﺔ ﻟﻠﻮراﺛﺔ ﻟﺘﺼﻨﻴﻔﺎت أﺧﺮى(‪.‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻧﺸﺎء ﺗﺼﻨﻴﻒ ‪abstract‬‬

‫{‪abstract class operation‬‬

‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪129‬‬


‫أﻧﺸـ ــــــ ـﺄـﻧﺎ ﺗﺼـ ــــــ ـﻨﻴﻒ ‪ abstract‬إذا ـﻣﺎ ـﺑﺪاﺧـﻠﻪ ﻣﻦ دوال ﻟﻜﻲ ﻳﺘﻢ اﻹﻋﻼن ﻋﻨـﻬﺎ ﻓﻘﻂ ـﺑﺪون‬
‫ﻋﻤﻠﻴﺔ ﺑﻨﺎء ﻟﻬﺎ ﻧﺠﻌﻠﻬﺎ ‪ abstract‬ﻛﻤﺎ ﺳﻴﺘﻢ ﺗﻮﺿﻴﺤﻪ اﻵن‪:‬‬

‫{‪abstract class operation‬‬

‫)‪abstract fun sum(num1:Int , num2:Int‬‬


‫)‪abstract fun sub(num1:Int , num2:Int‬‬
‫)‪abstract fun mul(num1:Int , num2:Int‬‬
‫)‪abstract fun dev(num1:Int , num2:Int‬‬

‫}‬

‫ﺣﺴﻨﺎ ﻟﻮ أردﻧﺎ ﺗﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات‪:‬‬

‫ﻧﺮى أـﻧﻪ ﻋـﻨﺪـﻣﺎ أردـﻧﺎ ﺗﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮ اﻋﺘﺮض ووﺿـ ــــــ ـﻊ ﺧﻂ أﺣﻤﺮ وﻋـﻨﺪ اﻟﻮﻗﻮف ﻋﻠـﻴﻪ ﻇﻬﺮ‬
‫اﻟﺴـ ــــــ ـﺒـﺐ وﻫﻮ أﻧـﻪ ﻋﻨـﺪﻣـﺎ ﺗﺮ ﻳـﺪ ﺗﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮ إﻣـﺎ أن ﺗﺠﻌـﻞ ﻟـﻪ ﻗﻴﻤـﺔ ﻣﺒـﺪﺋﻴـﺔ أو أن ﺗﺠﻌﻠـﻪ‬
‫‪abstract‬ﻟﻜﻲ ﺗﺴﺘﻄﻴﻊ أﻻ ﺗﺴﻨﺪ ﻟﻪ ﻗﻴﻤﺔ أي ﻳﻌﻨﻲ ﺳﻮف ﺗﺴﺘﺨﺪﻣﻪ وﺗﺴﻨﺪ ﻟﻪ ﻓﻴﻤﺎ ﺑﻌﺪ‪.‬‬

‫راﺑﻌﺎ ً ‪ :‬ﻣﺜﺎل‬

‫{‪abstract class operation‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪130‬‬


abstract fun sum(num1:Int , num2:Int)
abstract fun sub(num1:Int , num2:Int)
abstract fun mul(num1:Int , num2:Int)
abstract fun dev(num1:Int , num2:Int)

fun sayWelcome(){
println("Welcome")
}

class oper : operation(){

override fun dev(num1: Int, num2: Int) {


var result = num1 / num2
println("the result :$result")
}

override fun mul(num1: Int, num2: Int) {


var result = num1 * num2
println("the result :$result")
}

override fun sub(num1: Int, num2: Int) {


var result = num1 - num2
println("the result :$result")
}

override fun sum(num1: Int, num2: Int) {


var result = num1 + num2

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 131 ‫اﻟﺼﻔﺤﺔ‬


println("the result :$result")
}

fun main(args:Array<String>){
var op1 = oper()
println("the result of sum :")
op1.sum(4,3)
println("the result of sub :")
op1.sub(4,3)
println("the result of mul :")
op1.mul(3,4)
println("the result of dev :")
op1.dev(4,3)

println("---------------------------")
op1.sayWelcome()

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
the result of sum :
the result :7
the result of sub :
the result :1
the result of mul :
the result :12

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 132 ‫اﻟﺼﻔﺤﺔ‬


the result of dev :
the result :1
---------------------------
Welcome

multi inheritance ‫ ﻣﺒﺪأ اﻟﻮراﺛﺔ اﻟﻤﺘﻌﺪدة‬: ً ‫ﺧﺎﻣﺴﺎ‬

‫ وﻟﻜﻦ ﻟﻐﺔ‬classes ‫ ﻳﺮث أ ﻛﺜﺮ ﻣﻦ ﺗﺼـ ـــ ـﻨﻴﻒ‬class ‫اﻟﻮراﺛﺔ اﻟﻤﺘﻌﺪدة ﺗﻌﻨﻲ أن ﺗﺼـ ـــ ـﻨﻴﻒ‬
.‫ﺗﺮﻓﺾ ﻣﺒﺪأ اﻟﻮراﺛﺔ اﻟﻤﺘﻌﺪدة وﻟﺤﻞ ﻫﺬه اﻟﻤﻌﻀﻠﺔ‬kotlin

‫ وﻫﻲ ﻣﺎﺗﻌﻠﻤﻨﺎه ﻣﺴـ ــ ـﺒﻘﺎ ﺑﺤﻴﺚ ﻧﺴـ ــ ـﺘﻄﻴﻊ أن ﻧﻨﺸـ ــ ـﺊ ﺗﺼـ ــ ـﻨﻴﻒ‬interface ‫وﺟﺪت ﻟﺪﻳﻨﺎ‬
:‫ ﻣﺜﺎل‬،interface ‫ ﻟـ‬implements ‫ وأ ﻳﻀﺎ ﻧﻘﻮم ﺑﻌﻤﻞ‬class ‫ﻳﺮث ﻣﻦ ﺗﺼﻨﻴﻒ‬class

interface showDepartment{
fun showDept()
}

abstract class salary{


abstract fun getSal()
}

class employee : salary(), showDepartment{


override fun showDept() {
}
override fun getSal() {
}
}

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 133 ‫اﻟﺼﻔﺤﺔ‬


‫‪Override‬‬

‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم ‪Override‬‬

‫ﺗﻜﻤﻦ أﻫﻤﻴﺔ ﻫﺬا اﻟﻤﻔﻬﻮم ﺑﺄﻧﻪ ﺗﺘﻴﺢ ﻟﻨﺎ اﻟﻔﺮﺻـ ـــ ـﺔ ﺑﺄن ﻧﻨﺸـ ـــ ـﺊ داﻟﺔ ﻓﻲ اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﻮارث‬
‫ﻫﻲ ﻧﻔﺴـ ــ ـﻬﺎ ﻣﻮﺟﻮدة ﻓﻲ اﻟﺘﺼـ ــ ـﻨﻴﻒ اﻟﻤﻮروث ‪ ،‬ﻟﺘﺒﺴـ ــ ـﻴﻂ اﻷﻣﺮ ﻓﻠﻨﻔﺘﺮض أن ﻟﺪﻳﻨﺎ ﺗﺼـ ــ ـﻨﻴﻒ‬
‫‪class Person‬وﺑﺪاﺧﻠﻪ داﻟﺔ ﺗﻘﻮم ﺑﺎﻟﻄﺒﺎﻋﺔ‪:‬‬

‫• ﻳﺘﻮﺟﺐ ﻋﻠﻴﻨﺎ أن ﻧﺠﻌﻞ اﻟﺪاﻟﺔ ﻓﻲ اﻟﺘﺼﻨﻴﻒ اﻟﻤﻮروث ‪.open‬‬


‫{)(‪open class Person‬‬

‫{)‪open fun getInfo(name:String‬‬


‫)"‪println("welcome $name‬‬
‫}‬
‫{)(‪fun printWelcome‬‬
‫)"‪println("welcome‬‬
‫}‬

‫}‬

‫وﻟﺪي اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﻮارث ‪ class Employee‬ﻳﺮث ﺟﻤﻴﻊ ﻣﺤﺘﻮﻳﺎت ‪ class Person‬وﺑﻤﺎ‬
‫أﻧﻪ ﻳﺮﺛﻬﺎ ﻓﻬﺬا ﻳﻌﻨﻲ أﻧﻪ ﺳـ ـــ ـﻴﻤﻨﻌﻨﻲ ﻣﻦ ﺗﻜﺮار ﻧﻔﺲ ﻣﺴـ ـــ ـﻤﻰ اﻟﺪاﻟﺔ وﻟﻜﻦ ﻟﺘﺠﻨﺐ ﻫﺬا اﻷﻣﺮ‬
‫ﻧﺴﺘﺨﺪم ﻣﻔﻬﻮم ‪:override‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪134‬‬


‫{)(‪class Employee():Person‬‬

‫{)‪override fun getInfo(jobTitle:String‬‬


‫)" ‪println(" your job title :$jobTitle‬‬
‫}‬
‫}‬
‫• ﻧﻼﺣﻆ أن اﻟﺪاﻟﺔ اﻟﻤﻮﺟﻮدة ﺑﺪاﺧﻞ اﻟﺘﺼـ ـﻨﻴﻒ ‪ class Employee‬ﻫﻲ ﻧﻔﺴـ ـﻬﺎ اﻟﻤﻮﺟﻮدة‬
‫ﺼﻨﻴﻒ اﻟﻤﻮروث ‪ class Person‬وﻛﺘﺒﻨﺎ ﻗﺒﻠﻬﺎ ﻛﻠﻤﺔ ‪ override‬وﻫﺬا ﻳﻌﻨﻲ أﻧﻪ‬
‫ﺑﺪاﺧﻞ اﻟﺘ ـ‬
‫ﻋﻨﺪ إﻧﺸـﺎء ﻛﺎﺋﻦ ﻣﻦ ﻫﺬا اﻟﺘﺼـﻨﻴﻒ ﻟﻦ ﻳﺴـﺘﻄﻴﻊ اﻟﻮﺻـﻮل إﻟﻰ اﻟﺪاﻟﺔ ‪ getInfo‬اﻟﻤﻮﺟﻮدة‬
‫ﻓﻲ ‪.class Person‬‬
‫• ﻧﺮ ﻳـﺪ اﻟﺘﻮﺿـ ــــــ ـﻴﺢ ﺑـﺄﻧﻨـﺎ ﻟﻮ أردﻧـﺎ اﻟـﺪاﻟـﺔ أن ﺗﻨﻔـﺬ ﻧﻔﺲ اﻷواﻣﺮ وﻟﻜﻦ ﻧﺮ ﻳـﺪ اﻟﺰ ﻳـﺎدة ﻋﻠﻴﻬـﺎ‬
‫ﺑﻤﻌﻨﻰ أن اﻟـﺪاﻟـﺔ ﻻ ﺗﻜﺘﻔﻲ ﻓﻘﻂ ﺑـﺎﻷواﻣﺮ اﻟﺒﺮﻣﺠﻴـﺔ اﻟﺘﻲ ﺗﻤـﺖ ﻛﺘـﺎﺑﺘﻬـﺎ ﻓﻲ اﻟﺘﺼـ ــــــ ـﻨﻴﻒ‬
‫اﻟﻤﻮروث وإﻧﻤﺎ ﻧﺮ ﻳﺪ أن ﻧﻀﻴﻒ أواﻣﺮ أﺧﺮى‪:‬‬
‫{)(‪open class Employee():Person‬‬
‫{)‪final override fun getInfo(jobTitle:String‬‬
‫)"‪super.getInfo("Ahmed‬‬
‫)" ‪println(" your job title :$jobTitle‬‬
‫}‬
‫}‬

‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪135‬‬


‫إذا ﻧﻼﺣﻆ أﻧﻪ ﻳﺴﺘﻄﻴﻊ اﻟﻮﺻﻮل ﻷي داﻟﺔ ﻣﺎﻋﺪا ﺗﻠﻚ اﻟﺘﻲ ﻋﻤﻠﻨﺎ ﻟﻬﺎ ‪ override‬ﺣﻴﻨﻬﺎ ﻟﻦ‬
‫ﻳﺴﺘﻄﻴﻊ اﻟﻮﺻﻮل إﻻ ﻟﻠﺪاﻟﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺘﺼﻨﻴﻒ ‪.class Employee‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻛﻠﻤﺔ ‪final‬‬

‫اﺳـ ـــــ ـﺘﺨﺪام ﻫﺬه اﻟﻜﻠﻤﺔ ﻣﻊ اﻟﺘﺼـ ـــــ ـﻨﻴﻒ ﻳﻌﻨﻲ أﻧﻪ ﻏﻴﺮ ﻗﺎﺑﻞ ﻟﻠﻮراﺛﺔ وﻫﺬا اﻟﺸـ ـــــ ـﻲء ﻳﺮﺟﻊ‬
‫ﻻﺧﺘﻴﺎراﺗﻚ اﻟﺸـ ــ ـﺨﺼـ ــ ـﻴﺔ ﻓﻨﺤﻦ ﻟﻨﺠﻌﻞ اﻟﺘﺼـ ــ ـﻨﻴﻒ ﻳﻘﺒﻞ اﻟﻮراﺛﺔ ﻻﺑﺪ ﻣﻦ وﺿـ ــ ـﻊ ﻛﻠﻤﺔ ‪،open‬‬
‫ﻛﺬﻟﻚ ﻣﻦ أﺟﻞ ﺟﻌﻠﻪ ﺗﺼـ ــ ـﻨﻴﻒ ﻧﻬﺎﺋﻲ ﻏﻴﺮ ﻗﺎﺑﻞ ﻟﻠﻮراﺛﺔ ﻧﻀـ ــ ـﻊ ‪ ،final‬وﻳﻨﻄﺒﻖ ﻧﻔﺲ اﻟﺸـ ــ ـﻲء‬
‫ﻋﻠﻰ اﻟﺪوال‪.‬‬

‫ﻣﺜﺎل‪:‬‬

‫{)(‪open class Employee():Person‬‬

‫{)‪final override fun getInfo(jobTitle:String‬‬


‫)"‪super.getInfo("Ahmed‬‬
‫)" ‪println(" your job title :$jobTitle‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪136‬‬


‫}‬

‫ﻫﻨﺎ ﺟﻌﻠﻨﺎ ﻫﺬه اﻟﺪاﻟﺔ ﻻ ﺗﻘﺒﻞ أن ﺗﻜﻮن ﻣﺮة أﺧﺮى ﻓﻴﻤﺎ ﺑﻌﺪ ‪ ،override‬ﺑﻤﻌﻨﻰ ﻟﻮ أﻧﺸﺄت‬
‫ﺗﺼـ ـــــ ـﻨﻴﻒ أﺧﺮ ﺟﺪﻳﺪ ﻓﻴﻤﺎ ﺑﻌﺪ وأردت أن أﺟﻠﺐ اﻟﺪاﻟﺔ ﻧﻔﺴـ ـــــ ـﻬﺎ ﻋﻦ ﻃﺮ ﻳﻖ ‪ ، override‬ﻓﻠﻦ‬
‫ﻧﺴﺘﻄﻴﻊ وذﻟﻚ ﻷﻧﻬﺎ ‪.final‬‬

‫‪Overload‬‬

‫ﻓﻲ ﺑﻌﺾ اﻷﺣﻴﺎن ﻧﺼـﺎدف أ ﻛﺜﺮ ﻣﻦ ﺷـﺨﺺ ﻳﺤﻤﻠﻮن ﻧﻔﺲ اﻻﺳـﻢ وﻟﻬﻢ ﻧﻔﺲ اﺳـﻢ اﻷب‬
‫وﻟﻠﻤﺼـ ـﺎدﻓﺔ أ ﻳﻀـ ـﺎ ﻧﻔﺲ اﺳـ ـﻢ اﻟﻌﺎﺋﻠﺔ ﺻـ ـﺤﻴﺢ وﻟﻜﻨﻚ ﺗﺴـ ـﺘﻄﻴﻊ اﻟﺘﻔﺮ ﻳﻖ ﺑﻴﻦ ﺻـ ـﺪﻳﻘﻚ أي‬
‫واﺣﺪ ﻫﻮ ﻣﻨﻬﻢ وذﻟﻚ ﻷﻧﻪ ﻳﻤﺘﻠﻚ ﺧﺼـﺎﺋﺺ ﺧﺎﺻـﺔ ﺑﻪ وﺳـﻤﺎت ﺗﺪل ﻋﻠﻰ أﻧﻪ ﻫﻮ اﻟﻤﻘﺼـﻮد ‪،‬‬
‫أ ﻳﻀـ ـــــ ـﺎ ﻧﻔﺲ اﻟﺸـ ـــــ ـﻲء ﻳﺤﺪث ﻟﺪﻳﻨﺎ ﻋﻨﺪ اﻟﺒﺮﻣﺠﺔ ﺗﻮاﺟﺪ أ ﻛﺜﺮ ﻣﻦ داﻟﺔ ﻟﻬﻢ ﻧﻔﺲ اﻟﻤﺴـ ـــــ ـﻤﻰ‬
‫ﺑﺎﻟﻀ ـﺒﻂ ﻧﺴ ـﻤﻴﻪ ‪ overload‬وﻟﻜﻦ ﻟﻨﺮﻛﺰ اﻧﺘﺒﺎﻫﻨﺎ ﻗﻠﻴﻼ اﻧﻪ ﻫﺬه اﻟﺪوال ﻓﻘﻂ ﻟﻬﻢ ﻧﻔﺲ اﻻﺳ ـﻢ‬
‫وﻟﻜﻦ ﻳﺨﺘﻠﻔﻮن ﻣﻦ ﺣﻴﺚ ﺗﻤﺮ ﻳﺮ اﻟﻤﺘﻐﻴﺮات وﻧﻮع اﻟﺪاﻟﺔ ﻫﻞ ﺗﺮﺟﻊ ﺑﻘﻴﻤﺔ ام ﻻ وﻫﻜﺬا‪.‬‬

‫ﻣﺜﺎل‪:‬‬

‫{‪fun sum(a:Int , b:Int):Int‬‬


‫‪return a+b‬‬
‫}‬

‫{‪fun sum(a:Float, b:Float):Float‬‬


‫‪return a+b‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪137‬‬


‫اﻧﺸـ ـــــــ ـﺄﻧـﺎ داﻟﺘﻴﻦ ﻟﻬﻢ ﻧﻔﺲ اﻟﻤﺴـ ــــــ ـﻤﻰ وﻟﻜﻦ ﻛـﻞ واﺣـﺪة ﻣﻨﻬﻢ ﺗﺨﺘﻠﻒ ﻣﻦ ﺣﻴـﺚ ﻧﻮع‬
‫اﻟﻤﺘﻐﻴﺮات اﻟﻤﻤﺮرة ‪ ،‬أ ﻳﻀ ـﺎ ﻛﺎن ﺑﺎﻹﻣﻜﺎن ﺗﻌﺮ ﻳﻒ اﻟﺪاﻟﺔ اﻟﺜﺎﻧﻴﺔ وان ﻧﻮع اﻟﻤﺘﻐﻴﺮات ‪ int‬وﻟﻜﻦ‬
‫ﺑﺪل ﻣﻦ أن ﺗﻘﻮم ﺑﺠﻤﻊ ﻣﺘﻐﻴﺮ ﻳﻦ ﺗﻘﻮم ﻣﺜﻼ ﺑﺠﻤﻊ أ ﻛﺜﺮ‪.‬‬

‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

‫ﻧﻼﺣﻆ أﻧﻪ ﻋﻨﺪﻣﺎ اردﻧﺎ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ ﺑﺎﺳﻤﻬﺎ ﻃﻠﺐ ﻣﻨﺎ ان ﻧﺤﺪد أي داﻟﺔ ﻣﻨﻬﻢ ﻫﻞ اﻟﺘﻲ‬
‫ﻣﺘﻐﻴﺮاﺗﻬﺎ ‪ Int‬او ﺗﻠﻚ اﻟﺘﻲ ﻣﺘﻐﻴﺮاﺗﻬﺎ ‪.Float‬‬

‫{)>‪fun main(args:Array<String‬‬

‫)‪var result = sum(4,9‬‬


‫)"‪println ("the first function result is : $result‬‬
‫)‪var result1 = sum(2.3f,1.9f‬‬
‫)"‪println ("the second function result is : $result1‬‬

‫}‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪the first function result is : 13‬‬
‫‪the second function result is : 4.2‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪138‬‬


‫ﻣﻔﻬﻮم ‪ overload‬ﻧﺴ ـﺘﻄﻴﻊ ﺗﻨﻔﻴﺬه ﺣﺘﻰ ﺑﺪاﺧﻞ اﻟﺘﺼ ـﻨﻴﻒ ﻓﻴﻤﻜﻨﻨﺎ ﻣﻦ إﻧﺸ ـﺎء أ ﻛﺜﺮ ﻣﻦ‬
‫داﻟﺔ ﺑﻨﺎء وﻟﻜﻦ ﻣﻊ ﻣﺮاﻋﺎة ﻣﺎ ذﻛﺮﻧﺎه ﺳﺎﺑﻘﺎ‪.‬‬

‫‪Companion object‬‬

‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم ‪companion object‬‬

‫ﻫـﺬا اﻟﻤﻔﻬﻮم ﻳﻌﺒﺮ ﻋﻦ إﻣﻜـﺎﻧﻴـﺔ وﺻـ ــــــ ـﻮﻟـﻚ ﻟـﺪوال و ﻣﺘﻐﻴﺮات ﻣﻌﻴﻨـﺔ ﺗﻢ ﺗﻌﺮ ﻳﻔﻬـﺎ ﺑـﺪاﺧـﻞ‬
‫اﻟﺘﺼـ ــ ـﻨﻴﻒ ﺑﺪون اﺷـ ــ ـﺘﻘﺎق ﻛﺎﺋﻦ‪ ،‬ﻫﺬه اﻟﻤﺘﻐﻴﺮات ﻋﻤﻠﻬﺎ ﻣﺴـ ــ ـﺘﻘﻞ ﻋﻦ ﻣﺎ ﺑﺪاﺧﻞ اﻟﺘﺼـ ــ ـﻨﻴﻒ‬
‫ﻳﻌﻨﻲ أﻧﻨﻲ اﻧﺸـ ـــ ـﺄﺗﻬﺎ ﻟﻌﻤﻞ ﻣﻌﻴﻦ ﺑﺪون ان ﺗﺮﺗﺒﻂ ﺑﺎﻟﻤﺘﻐﻴﺮات اﻷﺧﺮى أو اﻟﺪوال اﻟﺘﻲ ﺑﺪاﺧﻞ‬
‫اﻟﺘﺼﻨﻴﻒ‪ ،‬وﻳﺘﻢ ﺗﻌﺮ ﻳﻒ ﻫﺬه اﻟﻤﺘﻐﻴﺮات واﻟﺪوال ﺑﺪاﺧﻞ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﺗﺴﻤﻰ ‪companion‬‬
‫‪.object‬‬

‫ﺛﺎﻧﻴﺎ ِ ‪ :‬ﻃﺮﻳﻘﺔ ﻛﺘﺎﺑﺘﻪ‬

‫{ ‪companion object‬‬

‫}‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺜﺎل‬

‫{ ‪class labtop‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪139‬‬


‫{ ‪companion object‬‬
‫{)(‪fun sayHello‬‬
‫)"‪println("Welcome in my project‬‬
‫}‬
‫}‬
‫‪var serialNum:Int = 0‬‬
‫" " = ‪var company:String‬‬
‫{)(‪fun getData‬‬
‫‪println(" labtop : $company \n the serial number is :‬‬
‫)"‪$serialNum‬‬
‫}‬

‫}‬

‫ﺳـ ــ ـﺘﻼﺣﻆ ﺑﺄﻧﻬﺎ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﻣﺴـ ــ ـﺘﻘﻠﺔ اﻧﺸـ ــ ـﺄﻧﺎ ﺑﺪاﺧﻠﻬﺎ داﻟﺔ ﺗﻘﻮم ﺑﺎﻟﺘﺮﺣﻴﺐ ‪ ،‬ﻛﻤﺎ ﻗﻠﻨﺎ‬
‫ﺟﻪ أي أـﻧﻪ ﻻ ﻋﻼـﻗﺔ ـﻟﻪ ﺑﻤﺤﺘﻮـﻳﺎت‬
‫ﺧ ﺎر ـ‬
‫ﻣﻪ ـ‬
‫ﺨﺪ ـ‬
‫ﻌﺔ ﻟﻦ ﺗﺴـ ــــــ ـﺘ ـ‬
‫ﻫﺬه اﻟﻘﻄ ـ‬
‫ﺧﻞ ـ‬
‫ﻣﺎ ﻳﺘﻢ ﻛﺘـﺎﺑﺘـﻪ ـﺑﺪا ـ‬
‫أـﻧﻪ ـ‬
‫اﻟﺘﺼﻨﻴﻒ اﻟﺒﺎﻗﻴﺔ‪.‬‬

‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪140‬‬


‫ﻧﻼﺣﻆ أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ اﺳـ ـــ ـﻢ اﻟﺘﺼـ ـــ ـﻨﻴﻒ ‪ class‬وﻣﻦ ﺛﻢ ﻇﻬﺮت ﻟﻨﺎ اﻟﺪاﻟﺔ اﻟﺘﻲ اﻧﺸـ ـــ ـﺄﻧﺎﻫﺎ‬
‫ﺑﺪاﺧﻞ ‪ companion object‬وﻫﻨﺎ ﻳﺘﺠﻠﻰ ﻟﻨﺎ اﻟﻬﺪف ﻣﻨﻬﺎ أﻧﻨﺎ ﻧﺴـ ــ ـﺘﻄﻴﻊ ان ﻧﻀـ ــ ـﻊ اﻟﻌﻤﻠﻴﺎت‬
‫واﻟﻤﺘﻐﻴﺮات ﺑﺪاﺧﻞ ﻫﺬه اﻟﻘﻄﻌﺔ اﻟﺒﺮﻣﺠﻴﺔ ﻟﻠﻮﺻﻮل إﻟﻴﻬﺎ ﺳﺮ ﻳﻌﺎ ﻣﻦ اﺳﻢ اﻟﺘﺼﻨﻴﻒ‪.‬‬

‫ﻫﻨﺎ ﻗﻤﻨﺎ ﺑﺎﺷـ ــ ـﺘﻘﺎق ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـ ــ ـﻨﻴﻒ وﻧﻼﺣﻆ أﻧﻪ ﻻ ﻳﺴـ ــ ـﺘﻄﻴﻊ اﻟﻮﺻـ ــ ـﻮل إﻟﻰ ﻣﺎ ﺑﺪاﺧﻞ‬
‫‪.companion object‬‬

‫راﺑﻌﺎ ً ‪ :‬ﻣﺘﻐﻴﺮ ﻳﺴﺘﻘﺒﻞ ‪companion object‬‬

‫ﻧﺴـ ـــــ ـﺘﻄﻴﻊ أن ﻧﻌﺮف ﻣﺘﻐﻴﺮ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴـ ـــــ ـﻴﺔ ﻗﻴﻤﺘﻪ ﻋﺒﺎرة ﻋﻦ ‪companion object‬‬
‫ﻫﻜﺬا‪:‬‬

‫‪var quiz: Float = 0f‬‬


‫‪var midterm: Float = 0f‬‬
‫‪var final: Float = 0f‬‬
‫{ ‪class student‬‬

‫{ ‪companion object‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪141‬‬


fun totalQuiz() {
println("Enter first Degree : ")
var quiz1: Float = readLine()!!.toFloat()
println("Enter second Degree : ")
var quiz2: Float = readLine()!!.toFloat()
var totalQuiz: Float = (quiz1 + quiz2) / 2
println("your quiz degree is : $totalQuiz")
}

fun totalDegree(quiz: Float, midterm: Float, final: Float) {


var result = quiz + midterm + final

if (result >= 90 && result <= 100) {


println("A")
} else if (result >= 80 && result <= 89) {
println("B")
} else if (result >= 70 && result <= 79) {
println("C")
} else if (result >= 60 && result <= 69) {
println("D")
} else {
println("F")
}
}
}

‫ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

fun main(args:Array<String>){

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 142 ‫اﻟﺼﻔﺤﺔ‬


var tQuiz = student.Companion

tQuiz.totalQuiz()
}

.companion object ‫ﻧﻌﺮف ﻣﺘﻐﻴﺮ وﻧﺮى أﻧﻨﺎ اﺳﻨﺪﻧﺎ ﻟﻪ‬

companion object ‫ ﻣﻌﻠﻮﻣﺎت ﺣﻮل‬: ً ‫ﺧﺎﻣﺴﺎ‬

‫ﻓﻲ ﺣﺎل أﻧﻨﺎ ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮات ﺑﺪاﺧﻠﻪ واﺳـ ــ ـﻨﺪﻧﺎ ﻟﻬﺎ ﻗﻴﻢ ﻓﺈﻧﻪ ﻋﻨﺪ اﺳـ ــ ـﺘﺪﻋﺎﺋﻬﺎ وﺗﻐﻴﺮ ﻗﻴﻤﺘﻬﺎ‬
:‫ ﺳﻨﻮﺿﺢ ذﻟﻚ‬، ‫ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ ﺳﻮف ﺗﺘﻐﻴﺮ ﺑﺸﻜﻞ ﻋﺎم أي ﻟﻴﺲ ﻓﻲ اﻷﻣﺮ ﻓﻘﻂ اﻟﻤﺤﺪد‬

class compan {
companion object {
var yourName = "Ahmed"
var familyName = "Aljuaid"
fun show() {
println("Hello $yourName $familyName")
}
}
var yourName = "Ahmed"
var familyName = "Aljuaid"
fun show() {
println("Hello $yourName $familyName")
}
}

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 143 ‫اﻟﺼﻔﺤﺔ‬


fun main(args:Array<String>){
var name = compan.Companion
var name1 = compan.Companion

name.show()
name1.show()
}

‫اﻟﺘﻨﻔﻴﺬ‬

Hello Ahmed Aljuaid


Hello Ahmed Aljuaid

‫ ﻓﻲ‬، ‫ ﻣﺎ ﻟﺬي ﺳـ ــ ـﻴﺤﺪث‬name ‫ﺣﺴـ ــ ـﻨﺎ ﻟﻨﻼﺣﻆ ﻗﻠﻴﻼ ﻟﻮ أردﻧﺎ ﺗﻐﻴﺮ اﻻﺳـ ــ ـﻢ اﻷول ﻓﻲ ﻣﺘﻐﻴﺮ‬
:‫اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

fun main(args:Array<String>){

var name = compan.Companion


var name1 = compan.Companion

name.yourName="Ali"
name.show()
name1.show()

‫اﻟﺘﻨﻔﻴﺬ‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 144 ‫اﻟﺼﻔﺤﺔ‬


‫‪Hello Ali Aljuaid‬‬
‫‪Hello Ali Aljuaid‬‬

‫ﺗﻢ ﺗﻐﻴﻴﺮ اﻻﺳـ ـــــ ـﻢ ﻓﻲ اﻟﻤﺘﻐﻴﺮ ﻳﻦ ‪ name and nam1‬ﺑﺎﻟﺮﻏﻢ ﻣﻦ أﻧﻨﺎ اﺳـ ـــــ ـﺘﺪﻋﻴﻨﺎ ‪name‬‬
‫وﻋﺪﻟﻨﺎ ﺑﻬﺎ ‪ ،‬وﻫﺬا ﻳﺪل ﻋﻠﻰ أﻧﻪ ﻏﻴﺮ ﻣﺴـ ــــ ـﺘﻘﻞ ﺑﺤﻴﺚ أﻧﻪ ﻗﻴﻤﺔ ﻣﺘﻐﻴﺮ ﻓﻲ ﻛﺎﺋﻦ واﺣﺪ ﻳﺠﻌﻠﻚ‬
‫ﻋﻨﺪﻣﺎ ﺗﺴﺘﺪﻋﻲ ﻧﻔﺲ اﻟﻤﺘﻐﻴﺮ ﻟﻜﺎﺋﻦ ﺟﺪﻳﺪ ﻫﻴﺎ ﻧﻔﺴﻬﺎ اﻟﻘﻴﻤﺔ‪.‬‬

‫اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ‪Nasted classes‬‬

‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ‬

‫ﻟﻐﺔ ‪ Kotlin‬ﺗﺪﻋﻢ ﻃﺮ ﻳﻘﺔ اﻟﺘﺼـ ـــ ـﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ﻫﻲ ﻋﺒﺎرة ﻋﻦ ﺗﺼـ ـــ ـﻨﻴﻒ ﻛﺒﻴﺮ وﺑﺪاﺧﻠﻪ‬
‫ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺘﺼﻨﻴﻔﺎت‪ ،‬ﻳﻌﻨﻲ ﺗﻌﺮ ﻳﻒ ‪ class‬ﺑﺪاﺧﻞ ‪.class‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻃﺮﻳﻘﺔ ﺗﻌﺮﻳﻒ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ‬

‫{‪class school‬‬

‫{‪class employee‬‬
‫}‬

‫{‪class student‬‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪145‬‬


‫}‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬أﻫﻤﻴﺔ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ‬

‫ﺗﻔﻴﺪ ﻓﻲ ﻋﻤﻠﻴﺔ اﻟﺘﻐﻠﻴﻒ ‪.Encapsulation‬‬

‫ﺗﻌﺘﺒﺮ ﻃﺮ ﻳﻘﺔ ﻋﻤﻠﻴﺔ ﻟﻮ ﻟﺪﻳﻨﺎ ﻋﺪد ﻣﻦ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺮﺗﺒﻄﺔ ﺑﺒﻌﺾ‪.‬‬

‫راﺑﻌﺎ ً ‪ :‬ﻣﺼﻄﻠﺤﺎت ﻣﻬﻤﺔ ﻓﻲ اﻟﺘﺼﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ‬

‫اﻟﺘﺼﻨﻴﻒ اﻟﺨﺎرﺟﻲ اﻟﻜﺒﻴﺮ ﻳﺴﻤﻰ‪:‬‬

‫‪OUTER CLASS‬‬

‫اﻟﺘﺼﻨﻴﻔﺎت اﻟﺪاﺧﻠﻴﺔ اﻟﺘﻲ ﺑﺪاﺧﻞ ‪ outer class‬ﺗﺴﻤﻰ‪:‬‬

‫‪INNER CLASS‬‬

‫ﺧﺎﻣﺴﺎ ً ‪ :‬اﻧﺸﺎء ﻛﺎﺋﻦ ﻣﻦ ‪inner class‬‬

‫ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬

‫)(‪var obj= outerClass.innerClass‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪146‬‬


‫ ﻣﺜﺎل‬: ً ‫ﺳﺎدﺳﺎ‬

class school{

class employee{
val id:Int = 0
var name :String =" "
fun getInfo(){
println("The Id of Employee is :$id \n Name :$name")
}
}

class student{
var grade:Char = ' '
var level:Int =0
var name :String =" "
fun getInfo(){
println("The student name is :$name \n Level : $level \n
Grade:$grade")
}
}

fun main (args:Array<String>){


var stu = school.student()
stu.name="Khalid Ali"
stu.level=5
stu.grade='A'

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 147 ‫اﻟﺼﻔﺤﺔ‬


‫)(‪stu.getInfo‬‬
‫}‬

‫‪ENUM class‬‬

‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم ‪Enum class‬‬

‫ﻫﻮ ﺗﺼ ـﻨﻴﻒ ﻧﺴ ـﺘﺨﺪﻣﻪ ﻟﻠﺘﻌﺪاد واﻷﺷ ـﻴﺎء اﻟﺜﺎﺑﺘﺔ اﻟﻐﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻐﻴﻴﺮ ‪ ،‬ﻣﺜﻼ اﻷﺳ ـﺒﻮع ﻳﺒﺪأ‬
‫ﻣﻦ اﻷﺣﺪ وﻳﻨﺘﻬﻲ اﻟﺴﺒﺖ وأﺳﻤﺎء اﻷﻳﺎم ﺛﺎﺑﺘﻪ وﻣﻌﺮوﻓﺔ وﻻ ﻳﻤﻜﻦ ﻟﻚ ﺗﻐﻴﻴﺮﻫﺎ‪.‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬اﺳﺘﺨﺪاﻣﻬﺎ ‪Enum class‬‬

‫ﻫﻮ ﺗﺼـ ــــ ـﻨﻴﻒ ﻧﻌﺮﻓﻪ وﻧﻀـ ــــ ـﻊ ﺑﺪاﺧﻠﻪ اﻟﺸـ ــــ ـﻲء اﻟﺬي ﻧﺮ ﻳﺪ أن ﻧﺜﺒﺘﻪ ‪ ،‬ﺑﻤﻌﻨﻰ أﻧﻨﻲ أر ﻳﺪ أن‬
‫اﺻـ ــ ـﻤﻢ ﻣﺸـ ــ ـﺮوع ﻳﺘﺤﺪث ﻋﻦ اﻟﻌﻤﻞ ﻓﻲ أ ﻳﺎم اﻷﺳـ ــ ـﺒﻮع ﻣﺜﻼ ﻓﺄﻋﺮف ﺗﺼـ ــ ـﻨﻴﻒ واﺿـ ــ ـﻊ ﺑﻪ أ ﻳﺎم‬
‫اﻷﺳﺒﻮع اﻟﺴﺒﻌﺔ وﻋﻨﺪﻣﺎ أﻗﻮم ﺑﺎﻟﻌﻤﻞ داﺧﻞ اﻟﻤﺸﺮوع ﻟﻦ ﻳﻘﺒﻞ ﻣﻨﻲ ﻳﻮم أﺧﺮ ﻏﻴﺮﻫﻢ‪.‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﺗﻌﺮﻳﻒ ‪Enum class‬‬

‫{‪enum class weekDays‬‬

‫‪Sunday , Monday , Tuesday , Wednesday , Thursday , Friday , Saturday‬‬

‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪148‬‬


‫§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ‬
‫{)>‪fun main(args:Array<String‬‬

‫‪ weekDays‬ﻧﻌرف ﻣﺗﻐﯾر ﻣن اﻟﺗﺻﻧﯾف‪var myDay : weekDays //‬‬

‫ھﻧﺎ ﻟو أردﻧﺎ أن ﻧﻧﺎدي ﯾوم ﻣن اﻷﯾﺎم ‪myDay = weekDays.Tuesday //‬‬

‫ھﻧﺎ اﻋﺗرض ﻷﻧﮫ ﻟﯾس ﻣن ﺿﻣن اﻟﻌﻧﺎﺻر اﻟﻣوﺟودة ‪myDay = weekDays.Ahmed //‬‬
‫ﻓﻲ اﻟﺗﺻﻧﯾف‬

‫}‬

‫‪data class‬‬

‫أوﻻ ً ‪ :‬ﻣﻔﻬﻮم ‪data class‬‬

‫ﻣﺎذا ﻟﻮ ﻛﺎن ﻟﺪﻳﻚ ‪ .class‬واردت ﻃﺒﺎﻋﺔ اﻟﻘﻴﻢ اﻟﺘﻲ داﺧﻠﻪ او ﻃﺒﺎﻋﺘﻪ ﻛ ـ ـــــــــ ـ ‪ Object‬ﻓﺎﻧﺖ‬
‫ﻋﻨﺪ اﻟﻘﻴﺎم ﺑﺎﻣﺮ اﻟﻄﺒﺎﻋﺔ ﺳ ـﻴﻘﻮم اﻟﻤﺘﺮﺟﻢ ﺑﻄﺒﺎﻋﺔ ‪ hashcode‬ﻟﻠ ـ ـــــــ ـ ‪ Object‬وﻟﻴﺲ ﻟﻠﺒﻴﺎﻧﺎت!‬
‫ﺣﺘﻰ ﻟﻮ اردت اﻟﻤﻘﺎرﻧﺔ ﺑﻴﻦ ا ﻛﺜﺮ ﻣﻦ ‪ Object‬ﻓﺴـ ـــ ـﻴﻘﻮم اﻟﻤﺘﺮﺟﻢ ﺑﺎﻟﻤﻘﺎرﻧﺔ ﺑﻴﻦ ‪hashcode‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪149‬‬


‫وﻟﻴﺲ ﺑﻴﻦ اﻟﻘﻴﻢ ﻟﻠ ـ ــــــ ـ ‪ .Object‬ا ﻳﻀـﺎ ً اذا اردت ﻧﺴـﺦ ﺑﻴﺎﻧﺎت ‪ Object‬اﻟﻰ ‪ Object‬ﺟﺪﻳﺪ ﻓﺎﻧﺖ‬
‫ﻟﺴﺖ ﻗﺎدر ﻋﻠﻰ ذﻟﻚ ﻣﻊ ‪ class‬ﺑﺼﻴﻐﺘﻪ اﻟﻌﺎﻣﺔ‪.‬‬

‫ﻟـﺬﻟـﻚ ﻛـﺎن ﻻﺑـﺪ ﻣﻦ ا ﻳﺠـﺎد ﻃﺮ ﻳﻘـﺔ ﺟـﺪﻳـﺪة او ﻣﻔﻬﻮم ﺟـﺪﻳـﺪ وﻫﻮ اﺳـ ــــــ ـﺘﺨـﺪام ‪data class‬‬
‫واﻟﺬي ﺳـ ـﻴﻘﻮم ﺑﺠﻤﻴﻊ اﻟﻤﻬﺎم ﻣﻦ ﻣﻘﺎرﻧﺔ وﻧﺴـ ـﺦ وﻃﺒﺎﻋﺔ ﺑﺸـ ـﻜﻞ ﺳـ ـﺮ ﻳﻊ ودون ﻛﺘﺎﺑﺔ اﻟﻜﺜﻴﺮ‬
‫ﻣﻦ اﻟﺪوال واﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ‪.‬‬

‫ﺛﺎﻧﻴﺎ ً ‪ :‬ﻃﺮﻳﻘﺔ ‪data class‬‬

‫{)‪data class employee(var id:Int , var name:String , var department:String‬‬

‫}‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬ﻣﺜﺎل ﻻﺳﺘﺨﺪام ‪class‬‬

‫ﻻﺣﻆ ﻓﻲ ﻫﺬه اﻟﺸـ ـــــ ـﻔﺮة اﻧﺸـ ـــــ ـﺌﻨﺎ ‪ class‬وﻗﻤﻨﺎ ﺑﺎرﺳـ ـــــ ـﺎل ﻟﻪ اﻻﺳـ ـــــ ـﻢ واﻟﻘﻴﻤﺔ وﻧﺮ ﻳﺪ ﻋﻤﻞ‬
‫ﻋﺔ ﻟﻠﻘﻴﻢ ﻓﻲ ‪ class‬وﻟﻜﻦ ﻳﺘﻀـ ــــــ ـﺢ ﻟـﻨﺎ ﻫـﻨﺎ اـﻧﻪ ﻻﻳﻘﻮم ـﺑﺎﻟﻄـﺒﺎ ـ‬
‫ﻋﺔ واﻟﻤـﻘﺎرـﻧﺔ ﻣـﺜﻞ‬ ‫ﻣـﻘﺎرـﻧﺎت وﻃـﺒﺎ ـ‬
‫ﻣﺎﻛﺎن ﻣﺘﻮﻗﻊ ﻓﻬﻮ ﻳﻘﻮم ﺑﺎﻟﻤﻘﺎرﻧﺔ ‪ hashcode‬او ﻳﻘﻮم ﺑﻄﺒﺎﻋﺘﻪ‪.‬‬

‫{ )‪class Employee(name: String, salary: Int‬‬


‫{ )(‪fun display‬‬
‫)"‪print("Hello Employee‬‬
‫}‬
‫}‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪150‬‬


fun main(args: Array<String>) {
val emp1 = Employee("Ahmed", 11200)
val emp2 = Employee("Ahmed", 11200)
//compare
print(emp1 == emp2) //false
//copy
val emp3 = emp1.copy() // unresolved reference
//print
print(emp1) // hashcode 'Employee@27c170f0'
}

class ‫ ﻗﺒﻞ ﺗﻌﺮﻳﻒ‬data ‫ اﺿﺎﻓﺔ‬: ً ‫راﺑﻌﺎ‬

‫اﻟﻘﻴﺎم ﺑﻬﺎ وﻳﺠﺐ ﻋﻠﻴﻚ‬class ‫اﻻن ﺑﻌﺪ ان اﺗﻀـ ـــ ـﺢ ﻟﻚ ان ﺑﻌﺾ اﻟﻌﻤﻠﻴﺎت ﻻﻳﻤﻜﻦ ﻟﻠ ـ ــــــــــ ـ‬
‫ ﻛﻞ ﻣﺎﻓﻲ اﻻﻣﺮ اﻧﻚ ﺗﺤﺘﺎج اﻟﻰ اﺿـ ـﺎﻓﺔ‬kotlin ‫ وﻟﻜﻦ ﻣﻊ‬. ‫ﻛﺘﺎﺑﺘﻬﺎ وﺗﻌﺮ ﻳﻔﻬﺎ ﻟﻠﻄﺒﺎﻋﺔ واﻟﻨﺴـ ـﺦ‬
‫ وﺳـ ـــــ ـﺘﻜﻮن ﻗﺎدر ﻋﻠﻰ اﻟﻘﻴﺎم ﺑﺠﻤﻴﻊ اﻟﻌﻤﻠﻴﺎت ﻣﻦ ﻧﺴـ ـــــ ـﺦ وﻃﺒﺎﻋﺔ‬class ‫ﻗﺒﻞ اﺳـ ـــــ ـﻢ‬data
.‫وﻣﻘﺎرﻧﺔ ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ‬

data class Employee(val name: String, val salary: Int) {


fun display() {
print("Hello Employee")
}
}

fun main(args: Array<String>) {


val emp1 = Employee("Ahmed", 11200)
val emp2 = Employee("Ahmed", 11200)
//compare

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 151 ‫اﻟﺼﻔﺤﺔ‬


print(emp1 == emp2) //true
//copy
val emp3 = emp1.copy(salary = 2000) // Employee(name=Ahmed,
salary=2000)
//compare
print(emp1 == emp3) //false
//print
println(emp1) // Employee(name=Ahmed, salary=11200)
println(emp3) // Employee(name=Ahmed, salary=2000)
}

‫ ﻣﺒﺎﺷـ ـ ـﺮة‬salary ‫ ﻣﻊ ﺗﻌﺪﻳﻞ ﻗﻴﻤﺔ‬emp1 ‫ﺗﻼﺣﻆ ﻓﻲ اﻟﺸـ ـ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻧﻲ ﻗﻤﺖ ﺑﻨﺴـ ـ ـﺦ‬
.‫وﻧﺴﺦ اﺳﻢ اﻟﻤﻮﻇﻒ دون ﺗﻌﺪﻳﻞ‬

Polymorphism

Polymorphism ‫ ﻣﺒﺪأ‬: ً ‫أوﻻ‬

‫ وﻟﺪﻳﻨﺎ أ ﻳﻀﺎ‬، ‫ إذا ﻫﻲ داﻟﺔ رﺋﻴﺴﻴﺔ‬super class ‫ﻫﺬا اﻟﻤﻔﻬﻮم ﻳﻌﻨﻲ ﺑﺄن ﻟﺪﻳﻨﺎ داﻟﺔ ﻓﻲ اﻟـ‬
.super class ‫ ﻟﻠﺪاﻟﺔ اﻟﺘﻲ ﻓﻲ‬override ‫ﻧﻘﻮم ﺑﻌﻤﻞ‬sub classes

.‫إذا ﺑﺸﻜﻞ ﻋﺎم ﻫﻲ داﻟﺔ ﻟﻬﺎ أ ﻛﺜﺮ ﻣﻦ وﺟﻪ‬

Polymorphism ‫ ﺷﺮوط‬: ً ‫ﺛﺎﻧﻴﺎ‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 152 ‫اﻟﺼﻔﺤﺔ‬


.sub classes ‫ و‬super class ‫• ﻻﺑﺪ ﻣﻦ ﺗﻮاﺟﺪ‬
‫ إذ ﺗـﻌـﺘـﺒـﺮ اﻟـﻮراﺛـ ــ ـﺔ ﻋـ ــ ـﺎﻣـ ــ ـﻞ ﻣـﻬـﻢ ﻟـﻨـﺘـﻤـﻜـﻦ ﻣـﻦ ﻗـﻮل أن اﻟـﻌـﻤـﻠـﻴـ ــ ـﺔ اﻟـﺘـﻲ‬،‫• اﻟـﻮراﺛـ ــ ـﺔ‬
.polymorphism ‫أﻣﺎﻣﻨﺎ‬
.sub ‫ ﻟﻬﺎ ﻓﻲ‬override ‫ وﻧﻘﻮم ﺑﻌﻤﻠﻴﺔ‬،open ‫ ﻧﺠﻌﻠﻬﺎ‬super class ‫ـ‬ ‫ــــــــــــــ‬ ‫• اﻟﺪاﻟﺔ اﻟﺘﻲ ﺑﺎﻟ ـ‬
classes

Polymorphism ‫ أﻣﺜﻠﺔ ﻣﺘﻨﻮﻋﺔ ﻟﻤﻔﻬﻮم‬: ً ‫ﺛﺎﻟﺜﺎ‬

(١) ‫ ﻣﺜﺎل‬v

open class schools(){

open fun getInfo(){


var name:String = readLine()!!
println("Welcome in to our schools $name")
}

class employees():schools(){
override fun getInfo() {
println("every employee in this school have ID")
}
}

class students():schools(){
override fun getInfo() {
println("we are proud of our students")

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 153 ‫اﻟﺼﻔﺤﺔ‬


‫}‬
‫}‬

‫}‬

‫• ﻧﻼﺣﻆ أﻧﻨـﺎ ﻗﻤﻨـﺎ ﺑﻌﻤـﻞ ‪ sub classes‬ﺑـﺪاﺧـﻞ ‪ super class‬وﻫـﺬا ﻟﻴﺲ ﻟﻠﺘﻌﻘﻴـﺪ‬
‫إﻧﻤﺎ ﻧﺮ ﻳﺪ ﺗﻮﺿـ ــــــ ـﻴﺢ ﺑﺄﻧﻚ ﺗﺴـ ــــــ ـﺘﻄﻴﻊ ﺻـ ــــــ ـﻨﻊ ﻧﻔﺲ اﻟﻌﻤﻞ ﺑﺄ ﻛﺜﺮ ﻣﻦ ﻃﺮ ﻳﻘﺔ )ﻛﻞ‬
‫اﻟﻄﺮق ﺗﺆدي إﻟﻰ روﻣﺎ( اﻟﻤﻬﻢ أن ﻳﻜﻮن اﻟﻌﻤﻞ ﺻﺤﻴﺢ وﻣﻨﻄﻘﻲ‪.‬‬

‫• ﻧﻼﺣﻆ أن اﻟﺘﺼـ ـﻨﻴﻒ اﻟﺮﺋﻴﺴـ ـﻲ ‪ super class‬ﻳﺤﺘﻮي ﻋﻠﻰ داﻟﺔ ﺗﺮﺣﻴﺒﻴﺔ واﻓﺘﺮﺿـ ـﻨﺎ اﻧﻚ‬
‫ﺳـ ــ ـﺘﻤﺮر ﻗﻴﻤﺔ اﻟﺘﻲ ﻫﻲ اﺳـ ــ ـﻢ اﻟﻤﺪرﺳـ ــ ـﺔ وﻣﻦ ﺛﻢ ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ رﺳـ ــ ـﺎﻟﺔ ﺗﺮﺣﻴﺒﻴﺔ ﺑﺎﺳـ ــ ـﻢ‬
‫اﻟﻤﺪرﺳﺔ اﻟﺘﻲ ﻣﺮرﺗﻬﺎ‪.‬‬
‫• ﻗﻤﻨﺎ ﺑﻌﻤﻞ ‪ override‬ﻟﻨﻔﺲ اﻟﺪاﻟﺔ ﻓﻲ ‪ sub classes‬وﻟﻜﻦ ﻛﻞ داﻟﺔ ﺗﻘﻮم ﺑﻌﻤﻞ ﻣﻌﻴﻦ‬
‫ﺣﺴـ ـــ ـﺐ اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﺘﻲ ﺗﺘﺒﻌﻪ ﻓﻤﺜﻼ ﺗﺼـ ـــ ـﻨﻴﻒ اﻟﻤﻮﻇﻔﻴﻦ ﻫﻲ ﻧﻔﺲ اﻟﺪاﻟﺔ ﻓﻴﻪ وﻟﻜﻦ‬
‫ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ ﻣﻌﻠﻮﻣﺔ أن ﻛﻞ ﻣﻮﻇﻒ ﻟﺪﻳﻬﻢ ﻳﺤﻤﻞ رﻗﻢ وﻇﻴﻔﻲ‪.‬‬
‫• ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ ‪:‬‬

‫ﻧﺴﺘﻄﻴﻊ أن ﻧﻘﻮم ﺑﻄﺮ ﻳﻘﺘﻴﻦ ﻻﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ ذات اﻟﻮﺟﻮه اﻟﻤﺘﻌﺪدة‪:‬‬

‫§ اﻟﻄﺮﻳﻘﺔ اﻷوﻟﻰ ‪ :‬ﻋﻤﻞ داﻟﺔ ﺧﺎرﺟﻴﺔ وﻳﺘﻢ اﻻﺳﺘﺪاﻋﺎء ﻣﻦ ﺧﻼﻟﻬﺎ‬


‫{)‪fun showInfo(s:schools‬‬
‫)(‪s.getInfo‬‬
‫}‬

‫{)>‪fun main (args:Array<String‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪154‬‬


‫)(‪var sch = schools‬‬
‫)‪showInfo(sch‬‬

‫}‬

‫ﻧﻼﺣﻆ ﻗﻤﻨﺎ ﺑﺘﻤﺮ ﻳﺮ ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﺮﺋﻴﺴـ ـــ ـﻲ وﺑﺪاﺧﻞ اﻟﺪاﻟﺔ ﻫﺬه ﺟﻠﺒﻨﺎ اﻟﺪاﻟﺔ اﻟﺘﻲ‬
‫ﺗﻄﺒﻊ اﻟﺒﻴﺎﻧﺎت ‪ ،‬وﻣﻦ ﺛﻢ ﻋﺮﻓﻨﺎ ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـﻨﻴﻒ اﻟﺮﺋﻴﺴـﻲ واﺳـﺘﺪﻋﻴﻨﺎ اﻟﺪاﻟﺔ اﻟﺘﻲ ﻋﺮﻓﻨﺎﻫﺎ‬
‫وﻣﺮرﻧﺎ ﻟﻬﺎ ﻧﻔﺲ اﻟﻜﺎﺋﻦ‪.‬‬

‫• ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‪:‬‬
‫‪happy kids‬‬
‫‪Welcome in to our schools happy kids‬‬

‫§ اﻟﻄﺮﻳﻘﺔ اﻟﺜﺎﻧﻴﺔ ‪ :‬ﺗﻌﺮﻳﻒ ﻛﺎﺋﻦ ﻣﺮﺟﻌﻪ اﻟـ ‪super class‬‬


‫{)>‪fun main (args:Array<String‬‬

‫)(‪var emp:schools = schools.employees‬‬


‫)(‪emp.getInfo‬‬
‫}‬
‫• ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‪:‬‬
‫‪every employee in this school have ID‬‬

‫‪ v‬ﻣﺜﺎل )‪(٢‬‬

‫{ )(‪open class primaryOperator‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪155‬‬


open fun operator() {
println("primary operator")
println("please choose between this operators(+ , -) :")
var c = readLine()!!
if (c == "+") {
println("Enter first number :")
var a: Int = readLine()!!.toInt()
println("Enter second number :")
var b: Int = readLine()!!.toInt()
var result = a + b
println("The result is = $result")
} else if (c == "-") {
println("Enter first number :")
var a: Int = readLine()!!.toInt()
println("Enter second number :")
var b: Int = readLine()!!.toInt()
var result = a – b
println("The result is = $result")
}
}

open class seconderyOperator() : primaryOperator() {


override fun operator() {
println("secondary operator")
println("please choose between this operators(* , /) :")
var c = readLine()!!
if (c == "*") {
println("Enter first number :")

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 156 ‫اﻟﺼﻔﺤﺔ‬


var a: Int = readLine()!!.toInt()
println("Enter second number :")
var b: Int = readLine()!!.toInt()
var result = a * b
println("The result is = $result")
} else if (c == "/") {
println("Enter first number :")
var a: Int = readLine()!!.toInt()
println("Enter second number :")
var b: Int = readLine()!!.toInt()
var result = a / b
println("The result is = $result")
}
}
}

fun main(args:Array<String>){
var secOp: primaryOperator=seconderyOperator()
secOp.operator()
}
:‫• ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
secondary operator
please choose between this operators(* , /) :
*
Enter first number :
3
Enter second number :
8
The result is = 24

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 157 ‫اﻟﺼﻔﺤﺔ‬


(٣) ‫ ﻣﺜﺎل‬v

open class shapes(){

open fun getShape(){


println("shape")
}

class rectangle():shapes(){
override fun getShape() {
println("Rectangle")
}
}

class circle():shapes(){
override fun getShape() {
println("Circle")
}
}

class triangle():shapes(){
override fun getShape() {
println("Triangle")
}
}

fun showShapes(s:shapes){

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 158 ‫اﻟﺼﻔﺤﺔ‬


‫)(‪s.getShape‬‬
‫}‬

‫{)>‪fun main (args:Array<String‬‬


‫)(‪var shape1 = triangle‬‬
‫)‪showShapes(shape1‬‬
‫}‬
‫• ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‪:‬‬
‫‪Triangle‬‬

‫اﻻﺳﺘﺜﻨﺎءات ‪exception -‬‬

‫أوﻻ ‪ :‬ﻣﺎ ﻫﻲ اﻻﺳﺘﺜﻨﺎءات‬

‫ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺧﻄﺄ ﺣﺪث وﻟﻤﻌﺎﻟﺠﺔ ﻫﺬا اﻟﺨﻄﺄ وﺟﺪت ﻣﺎ ﺗﺴﻤﻰ ﺑﺎﻻﺳﺘﺜﻨﺎءات‪.‬‬

‫ﺛﺎﻧﻴﺎ ‪ :‬ﺗﻜﻮﻳﻦ اﻻﺳﺘﺜﻨﺎءات‬

‫ﺗﺘﻜﻮن ﺟﻤﻠﺔ اﻻﺳـ ـﺘﺜﻨﺎء ﻣﻦ ﻗﻄﻌﺘﻴﻦ ﺑﺮﻣﺠﻴﺘﻴﻦ أﺳـ ـﺎﺳـ ـﻴﺘﻴﻦ ﻫﻲ ‪ : try , catch‬وﻗﻄﻌﺔ‬
‫ﺛﺎﻟﺜﺔ اﺧﺘﻴﺎر ﻳﺔ وﻫﻲ ‪.finally :‬‬

‫‪try v‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪159‬‬


‫ﻄﺄ ﻓﻴـﻬﺎ ﺑﻤﻌﻨﻰ ﻟﺴـ ــــــ ــﻨﺎ‬
‫ﻤﻞ وﻗﻮع اﻟﺨ ـ‬
‫ﻌﺔ اﻟﺒﺮﻣﺠـﻴﺔ اﻷواﻣﺮ اﻟﺘﻲ ﻧﺤﺘ ـ‬ ‫• ﻧﻜـﺘﺐ ﻓﻲ ـ‬
‫ﻫﺬه اﻟﻘﻄ ـ‬
‫ﻣﺘﺄ ﻛﺪﻳﻦ ﻣﻦ ﻣﺪى ﺻﺤﺔ ﻣﺎ ﻛﺘﺒﻨﺎه‪ ،‬وﻣﻦ اﻟﻤﺤﺘﻤﻞ أن ﻻ ﻳﻜﻮن ﺑﻬﺎ ﺧﻄﺄ‪.‬‬
‫• ﻓﻲ ﺣﺎل ﻗﺎم اﻟﺒﺮﻧﺎﻣﺞ ﺑﻘﺮاءة ﻫﺬه اﻟﻘﻄﻌﺔ ووﺟﺪ ﺧﻄﺄ ﻳﻘﻮم ﺑﺘﺠﺎﻫﻞ ﺑﺎﻗﻲ اﻷواﻣﺮ وﻳﻨﺘﻘﻞ‬
‫إﻟﻰ ﻗﻄﻌﺔ‪catch .‬‬
‫ـ ‪ catch‬وﻳﻨﺘﻘﻞ إﻟﻰ‬ ‫ـــــــــــــ‬ ‫• ﻓﻲ ﺣﺎل ﺗﻤﺖ ﻗﺮاءة ﻗﻄﻌﺔ ‪ try‬وﻟﻢ ﻳﻜﻦ ﻓﻴﻬﺎ ﺧﻄﺄ ﻻ ﻳﺪﺧﻞ اﻟ ـ‬
‫‪finally‬ﻓﻲ ﺣﺎل ﺗﻮﻓﺮﻫﺎ‪.‬‬
‫{‪try‬‬

‫}‬

‫‪catch v‬‬

‫• ﻓﻲ اﻟـﺒﺪا ـﻳﺔ ﻧﻌﺮف ﻣﺘﻐﻴﺮ ﺑﻴﻦ اﻟﻘﻮﺳـ ــــــ ـﻴﻦ وﻧﻌﻴﻦ ﻧﻮع اﻟﻤﺘﻐﻴﺮ وﻫﻮ ﻧﻮع اﻟﺨ ـ‬
‫ﻄﺄ ﻣﻨﻄﻘﻲ ‪،‬‬
‫ر ﻳﺎﺿﻲ …إﻟﺦ‬
‫• ﺑﺪاﺧﻞ اﻟﻘﻄﻌﺔ اﻟﺒﺮﻣﺠﻴﺔ ﻧﻜﺘﺐ أواﻣﺮ ﺧﺎﺻـﺔ ﺑﻨﻮع اﻟﺨﻄﺄ اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻤﺮ ﻳﺮه ﺑﻤﻌﻨﻰ ﻟﻮ‬
‫ﻫﺬه‬ ‫ﻄﺄ ﻓﻲ اﻟﺒﺮـﻧﺎﻣﺞ ﻧﻮ ـ‬
‫ﻋﻪ ر ـﻳﺎﺿـ ــــــ ـﻲ ﻟﻦ ﺗﺴـ ــــــ ـﺘﻄﻴﻊ ـ‬ ‫ﺣﺪث ﺧ ـ‬
‫ﻄﺄ ﻣﻨﻄﻘﻲ ‪ ،‬و ـ‬
‫ـﻛﺎن ﻧﻮع اﻟﺨ ـ‬
‫اﻟﻘﻄﻌﺔ ﺣﻞ اﻟﻤﺸـ ـﻜﻠﺔ وﻟﺤﻞ اﻟﻤﺸـ ـﻜﻠﺔ ﻧﻘﻮم ﺑﺈﻧﺸـ ـﺎء ﻗﻄﻌﺔ ‪ catch‬أﺧﺮى ﻣﺨﺼـ ـﺼـ ـﺔ‬
‫ﻟﻨﻔﺲ ﻧﻮع اﻟﺨﻄﺄ‪.‬‬
‫{)‪catch(variable:exceptionType‬‬

‫}‬

‫‪finaly v‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪160‬‬


.‫ﻗﻄﻌﺔ اﺧﺘﻴﺎر ﻳﺔ ﺗﺘﻀﻤﻦ أواﻣﺮ ﻣﻌﻴﻨﺔ ﻋﺎدﻳﺔ ﻟﻴﺲ ﻟﻬﺎ ﻋﻼﻗﺔ ﺑﺎﻟﺨﻄﺄ‬

‫ ﻣﺜﺎل‬: ً ‫ﺛﺎﻟﺜﺎ‬

try{
println("enter first number :")
var number1:Int = readLine()!!.toInt()
println("enter second number :")
var number2:Int = readLine()!!.toInt()
var result = number1+number2
println("The result is: $result")
}

catch(numEx:NumberFormatException){
println("only integer number entered")
}

‫ وﻟﻜﻦ ﻟﻨﻔﺘﺮض‬، ‫ر ﺑﻤﺎ ﻟﻠﻮﻫﻠﺔ اﻷوﻟﻰ ﺗﺮى اﻟﺒﺮﻧﺎﻣﺞ ﻓﺘﺴـ ــ ـﺘﻐﺮب ﺑﺄﻧﻪ ﺻـ ــ ـﺤﻴﺢ ﻻ ﻳﻮﺟﺪ ﺧﻄﺄ‬
‫ﺠﺔ‬
‫ﻌ ﺎﻟ ـ‬
‫ﺧﺎل ﻧﺺ ﻓﻼـﺑﺪ ﻫـﻨﺎ ﻣﻦ ﻣ ـ‬
‫ﺤﺔ ـﻗﺎم ـﺑﺈد ـ‬
‫ﺧﻞ ارـﻗﺎم ﺻـ ــــــ ـﺤﻴ ـ‬
‫ﺨﺪم ـﺑﺪل ﻣﻦ أن ـﻳﺪ ـ‬
‫أن اﻟﻤﺴـ ــــــ ـﺘ ـ‬
.‫اﻟﺨﻄﺄ‬

Multi-threading

multi-thread ‫ ﻣﻔﻬﻮم‬: ً ‫أوﻻ‬

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 161 ‫اﻟﺼﻔﺤﺔ‬


.‫ﻫﻮ ﻛﻴﻔﻴﺔ ﺗﻨﻔﻴﺬ ﻋﻤﻞ أ ﻛﺜﺮ ﻣﻦ داﻟﺔ ﻓﻲ أن واﺣﺪ‬

multi-thread ‫ ﻋﻤﻞ‬: ً ‫ﺛﺎﻧﻴﺎ‬

‫ اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﻌﺪﻳﺪ ﻣﻦ‬Thread class ‫ﻟﻨﺘﻌﺎﻣﻞ ﻣﻊ ﻋﺬا اﻟﻤﻔﻬﻮم ﺳـﻨﺴـﺘﻌﻴﻦ ﺑ ـ ـــــــ ـ‬
:‫ ﻣﺜﺎل‬.‫اﻟﺪوال اﻟﺘﻲ ﺗﻔﻴﺪﻧﺎ ﻓﻲ ﻣﻮﺿﻮﻋﻨﺎ ﻫﺬا‬

class first :Thread() {

override fun run() {


var num = 0

for (i in 1..3) {
num = num + i
println(num)
Thread.sleep(1000)
}

println("-----------------------\n The result is :$num")


}}

class second :Thread() {

override fun run() {


var num = 1

for (i in 1..3) {
num = num * i

Kotlin ‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ‬ 162 ‫اﻟﺼﻔﺤﺔ‬


‫)‪println(num‬‬
‫)‪Thread.sleep(1000‬‬
‫}‬
‫}})"‪println("-----------------------\n The result is :$num‬‬

‫{)>‪fun main(args:Array<String‬‬

‫)(‪var F = first‬‬
‫)(‪var S = second‬‬

‫)(‪F.start‬‬
‫)(‪S.start‬‬

‫}‬
‫• ﻗﻤﻨﺎ ﺑﺈﻧﺸ ـﺎء ﺗﺼ ـﻨﻴﻔﻴﻦ ﻣﺨﺘﻠﻔﻴﻦ اﺣﺪﻫﻤﺎ ﻟﺠﻤﻊ اﻷرﻗﺎم اﻟﻮاﻗﻌﺔ ﺑﻴﻦ ‪ ٠‬و ‪ ، ٥‬وﺗﺼ ـﻨﻴﻒ‬
‫ﻟﻨﺎﺗﺞ ﺿﺮب اﻷﻋﺪاد اﻟﻮاﻗﻌﺔ ﺑﻴﻦ ‪ ٠‬و ‪.٥‬‬
‫• ﺗﻤﺖ ﻋﻤﻠﻴﺔ اﻟﻮراﺛﺔ ﻓﻲ اﻟﺘﺼﻨﻴﻔﻴﻦ ﻣﻦ ‪.Thread‬‬
‫• ﻓﻲ ﻛﻞ ﻣﻦ اﻟﺘﺼـ ـــــ ـﻨﻴﻔﻴﻦ اﺳـ ـــــ ـﺘﻌﻤﻠﻨﺎ داﻟﺔ ﻣﻨﺸـ ـــــ ـﺄة ﻓﻲ ‪ Thread‬ﻟﻠﻌﻤﻞ وﺗﺠﻬﻴﺰ اﻷواﻣﺮ‬
‫ﺑـﺪاﺧﻠﻬـﺎ وﻫﻲ ‪ run‬وﺑﻤـﺎ أﻧﻬـﺎ ﻣﻨﺸـ ـــــــ ﺄة ﻣﻦ ﻗﺒـﻞ ﻓﻲ ﺗﺼـ ــــــ ـﻨﻴﻒ ‪ Thread‬ﻓﻨﻘﻮم ﺑﻌﻤـﻞ‬
‫‪override‬ﻟﻬﺎ‪.‬‬
‫ﻌﻞ اـﻟﺪاﻟﺘﻴﻦ ﻓﻲ اﻟﺘﺼـ ــــــ ـﻨﻴﻔﻴﻦ ﻳﻌﻤﻠﻮن ـﺑﺎﻟﺘﺰاﻣﻦ ﺑﻤﻌﻨﻰ أﻧـﻨﺎ ﻟﻦ ﻧﻨﺘﻈﺮ داـﻟﺔ ‪ run‬ﻓﻲ‬
‫• ﻟﺠ ـ‬
‫ﺗﺼــﻨﻴﻒ ‪ first‬ﻟﻠﻌﻤﻞ وﻣﻦ ﺑﻌﺪ اﻧﺘﻬﺎﺋﻬﺎ ﻧﻨﺘﻘﻞ إﻟﻰ اﻟﺪاﻟﺔ ‪ run‬ﻓﻲ اﻟﺘﻨﺼــﻴﻒ ‪، second‬‬
‫ﻧﺴـ ـــ ـﺘﺨﺪم داﻟﺔ ‪ sleep‬اﻟﺘﻲ ﻧﺤﺪد ﻟﻬﺎ اﻟﻮﻗﺖ ﺑﺎﻟ ـ ــــــــــ ـ )‪ ،Millis (milliseconds‬ﺗﻘﻮم ﻫﺬه‬
‫اﻟﺪاﻟﺔ ﺑﺘﻌﻄﻴﻞ ﻋﻤﻞ اﻟﺪاﻟﺔ اﻟﺤﺎﻟﻴﺔ ﻣﺪة زﻣﻨﻴﺔ ﻣﻌﻴﻨﺔ وﻣﻦ ﺛﻢ ﺗﻌﻮد ﻟﻌﻤﻠﻬﺎ ﻣﻦ ﺟﺪﻳﺪ‪.‬‬
‫• اﻷن ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﻋﻤﻠﻨﺎ ﻧﻘﻮم ﺑﻌﻤﻞ ﻛﺎﺋﻦ ﻣﻦ ﻛﻼ اﻟﺘﺼﻨﻴﻔﻴﻦ واﻟﻌﻤﻞ ﺑﻬﻤﺎ‪.‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪163‬‬


‫• ﻧﻼﺣﻆ أﻧﻨﺎ ﻟﻢ ﻧﺴـ ـﺘﺪﻋﻲ داﻟﺔ ‪ run‬ﻟﺘﻨﻔﻴﺬﻫﺎ وﻫﺬا ﺻـ ـﺤﻴﺢ ﻷن اﻟﻤﺴـ ـﺆول ﻋﻦ ﺗﻨﻔﻴﺬﻫﺎ‬
‫ﻫﻲ اﻟﺪاﻟﺔ اﻟﻤﻮﺿﺤﺔ ﺑﺎﻟﻤﺜﺎل وﻫﻲ‬
‫‪start : start() .‬‬

‫§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ‬
‫‪1‬‬
‫‪1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪6‬‬
‫‪6‬‬
‫–———————‬
‫‪The result is :6‬‬
‫–———————‬
‫‪The result is :6‬‬

‫ﺛﺎﻟﺜﺎ ً ‪ :‬اﻟﺪوال اﻟﺘﻲ ﺗﻌﻤﻞ ﻣﻊ ‪thread‬‬

‫‪Start v‬‬

‫• ﻳﻌﻮد ﺑﻘﻴﻤﺔ ﻣﻨﻄﻘﻴﺔ‬


‫• إذا ﻛﺎﻧﺖ ﻗﻴﻤﺘﻪ ‪ true‬ﻳﺘﻢ ﺗﺸﻐﻴﻞ اﻟـ ‪.thread‬‬

‫‪run v‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪164‬‬


‫• ﻟﻜﺘﺎﺑﺔ اﻷواﻣﺮ اﻟﺘﻲ ﺳﻴﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻋﻨﺪ ﻋﻤﻞ ‪ start‬ﻟـ‪.Thread‬‬

‫‪sleep v‬‬

‫• ﻹﻳﻘﺎف ﻋﻤﻞ اﻟﺪاﻟﺔ ﻣﺪة ﻣﻌﻴﻨﻪ ﻧﻘﻮم ﺑﺘﺤﺪﻳﺪﻫﺎ ﺑﺎﻟـ‪. milliseconds‬‬

‫‪Suspend v‬‬

‫• ﻹﻳﻘـﺎف ﻋﻤـﻞ اﻟـﺪاﻟـﺔ ﻣـﺪة ﻏﻴﺮ ﻣﺤـﺪدة ‪ ،‬وﻻﺳـ ــــــ ـﺘﺌﻨـﺎف ﻋﻤﻠﻬـﺎ ﻧﻘﻮم ﺑـﺎﺳـ ــــــ ـﺘـﺪﻋـﺎء اﻟـﺪاﻟـﺔ‬
‫‪.resume‬‬

‫‪resume v‬‬

‫• ﺗﻜﻤﻞ ﺗﻨﻔﻴﺬ اﻷواﻣﺮ اﻟﺘﻲ ﺗﻮﻗﻔﺖ ﺑﺴﺒﺐ اﻟﺪاﻟﺔ ‪.Suspend‬‬

‫‪stop v‬‬

‫• ﺗﻮﻗﻒ ﻋﻤﻞ اﻟﻜﺎﺋﻦ اﻟﺬي ﻳﺮث ‪.Thread‬‬

‫‪id v‬‬

‫• ﻟﻠﺤﺼﻮل ﻋﻠﻰ ‪ id‬اﻟﺨﺎص ﺑﻜﺎﺋﻦ ‪.Thread‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪165‬‬


‫‪setName v‬‬

‫• ﻟﺘﻌﻴﻴﻦ اﺳﻢ ﺑﺎﻟﻜﺎﺋﻦ اﻟﺨﺎص ﺑـ ‪.Thread‬‬

‫‪getName v‬‬

‫• ﻟﻠﺤﺼﻮل ﻋﻠﻰ اﺳﻢ اﻟﻜﺎﺋﻦ اﻟﺨﺎص ﺑـ ‪.Thread‬‬

‫‪getPriority v‬‬

‫• ﻳﻌﻮد ﺑﻘﻴﻤﺔ ﻣﻦ ‪.١٠-١‬‬


‫• ﻳﻌﺒﺮ ﻋﻦ اﻷوﻟﻮﻳﺔ اﻟﺘﻲ ﻳﻤﺘﻠﻜﻬﺎ اﻟﻜﺎﺋﻦ اﻟﺨﺎص ﺑـ ‪.Thread‬‬
‫• اﻷوﻟﻮﻳﺔ اﻻﻓﺘﺮاﺿـ ــــ ـﻴﺔ ﻫﻲ ‪ ٥‬وﻟﻜﻦ ﻟﻮ أردﻧﺎ ﺗﻐﻴﻴﺮ ﻗﻴﻤﺘﻬﺎ ﻧﺴـ ــــ ـﺘﺨﺪم ‪ setPriority‬اﻟﺘﻲ‬
‫ﺗﺴﻤﺢ ﻟﻨﺎ ﺑﺘﻌﻴﻴﻦ ﻗﻴﻤﺔ ﺟﺪﻳﺪة ﻟﻸوﻟﻮﻳﺔ‪.‬‬

‫‪toString v‬‬

‫• ﺗﻌﻮد ﺑﻤﺠﻤﻮﻋﺔ ﻣﻦ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻦ اﻟﻜﺎﺋﻦ اﻟﺨﺎص ﺑـ‬


‫‪Thread ( name – id – group).‬‬

‫‪Interrupt v‬‬

‫• ﻟﻤﻘﺎﻃﻌﺔ ﻋﻤﻞ اﻟﻜﺎﺋﻦ اﻟﺨﺎص ﺑـ ‪.Thread‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪166‬‬


‫‪join v‬‬

‫• ﺗﻬﺘﻢ ﺑﺈﻧﺠﺎز ﺟﻤﻴﻊ اﻷواﻣﺮ اﻟﺨﺎﺻﺔ ﺑﻜﺎﺋﻦ اﻟ ـ ــ ‪ Thread‬وﺑﻌﺪ اﻻﻧﺘﻬﺎء ﻣﻨﻬﺎ اﻻﻧﺘﻘﺎل إﻟﻰ ﻣﺎ‬
‫ﺗﺒﻘﻰ ﻓﻲ ‪.main‬‬

‫‪State v‬‬

‫• ﻳﻌﻮد ﺑﺤﺎﻟﺔ ﻛﺎﺋﻦ اﻟـ ‪.Thread‬‬

‫‪any‬‬

‫أوﻻ ً ‪ :‬ﻣﺎ ﻫﻮ ‪class any‬‬

‫ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺗﺼ ـﻨﻴﻒ رﺋﻴﺴ ـﻲ ﻣﻮﺟﻮد ﻓﻲ ﻟﻐﺔ ‪ Kotlin‬ﻳﺤﺘﻮي ﺑﺪاﺧﻠﻬﺎ ﻋﻠﻰ دوال واﺣﺪاث‬
‫ﺟﺎﻫﺰة ﻟﻠﺘﻨﻔﻴﺬ ‪ ،‬ﻓﻲ ﺣﺎل إﻧﺸـﺎﺋﻚ ﺗﺼـﻨﻴﻒ ﺟﺪﻳﺪ ﻓﺈن ﻫﺬا اﻟﺘﺼـﻨﻴﻒ ﺗﻠﻘﺎﺋﻴﺎ ﻳﺮث ﻣﻦ ﺗﺼـﻨﻴﻒ‬
‫‪ . any‬إذا ﻳﻌﺘﺒﺮ ‪ class any‬ﻫﻮ ‪ super class‬ﻟﺠﻤﻴﻊ اﻟﺘﺼﻨﻴﻔﺎت ‪.classes‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪167‬‬


‫ﻟﺬﻟﻚ ﻋﻨﺪ اﺷـﺘﻘﺎق ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـﻨﻴﻒ اﻟﺬي اﻧﺸـﺄﻧﺎه ﻓﺈﻧﻨﺎ ﺑﺎﻟﺘﺄ ﻛﻴﺪ ﺳـﻨﻼﺣﻆ وﺟﻮد دوال‬
‫ﺟﺎﻫﺰة أ ﻳﻀﺎ ﻏﻴﺮ ﺗﻠﻚ اﻟﺘﻲ ﻛﺘﺒﻨﺎﻫﺎ ‪ ،‬ﻣﺜﻞ‪.hashCode , toString , equales,…etc :‬‬

‫| ﻣﺨﺘﺼﺮ ﻟﻐﺔ ‪Kotlin‬‬ ‫اﻟﺼﻔﺤﺔ ‪168‬‬

You might also like