Professional Documents
Culture Documents
تعلم لغة الكوتلن
تعلم لغة الكوتلن
Kotlin
أﺣﻤﺪ اﻟﺠﻌﻴﺪ
اﻟﻤﺤﺘﻮﻳﺎت
اﻟﻤﺤﺘﻮﻳﺎت 2 .....................................................................................................................................................
اﻟﻤﻘﺪﻣﺔ20 .....................................................................................................................
اﻟﻤﺘﻐﯿﺮات 21 ........................................................................................................
أوﻻ :ﺗﻌﺮﻳﻒ اﻟﻤﺘﻐﻴﺮات21 ............................................................................................................................
ﺛﺎﻧﻴﺎ ً :أﻧﻮاع اﻟﻤﺘﻐﻴﺮات 23 ..............................................................................................................................
ﺛﺎﻟﺜﺎ ً :ﺗﺤﻮﻳﻞ اﻟﻤﺘﻐﻴﺮات 24 ...........................................................................................................................
راﺑﻌﺎ ً :ﺑﺮﻧﺎﻣﺞ "25 ................................................................................................................. "hello world
ادﺧﺎل اﻟﺒﯿﺎﻧﺎت 26 ...................................................................................................
ﻟﻐﺔ Kotlinاﺣﺪى اﻟﻠﻐﺎت اﻟﺘﻲ ﻻﻗﺖ رواﺟﺎ ً ﻓﻲ اﻟﺴـﻨﺘﻴﻦ اﻟﻤﺎﺿـﻴﺔ وزادت ﺷـﻌﺒﻴﺘﻬﺎ ﺑﻌﺪ دﻋﻤﻬﺎ اﻻﻧﺪروﻳﺪ
ﺑﺸﻜﻞ رﺳﻤﻲ ﻓﻲ اﻧﺪروﻳﺪ اﺳﺘﺪﻳﻮ ﻟﺒﺮﻣﺠﺔ ﺗﻄﺒﻴﻘﺎت اﻻﻧﺪروﻳﺪ ..
ﻟﻐﺔ Kotlinﻗﺎدرة ﻋﻠﻰ ﺑﺮﻣﺠﺔ ﺗﻄﺒﻴﻘﺎت اﻟﻮﻳﺐ واﻟ ـ ــــــــــ ـ IOSﺑﺸـ ــ ـﻜﻞ ﻃﺒﻴﻌﻲ ﺑﺎﺳـ ــ ـﺘﺨﺪام أدوات
ﻟﻠﺘﻄﻮﻳﺮ ﻣﺪﻋﻮﻣﺔ ﻣﺒﺎﺷﺮة ﻣﻦ اﻟﺸﺮﻛﺔ اﻟﻤﻄﻮرة ﻟـKotlin
ﻜﺘﻴـﺐ ا ﻳﺠـﺎز ﻟﻐـﺔ Kotlinﺑﺸـ ــــــ ـﻜـﻞ ﻋـﺎم ﻟﻴﺘﻤﻜﻦ اﻟﻤﺴـ ــــــ ـﺘﺨـﺪم اﻟﻤﺒﺘـﺪئ ﻓﻲ
ﺣـﺎوﻟـﺖ ﻓﻲ ﻫـﺬا اﻟ ُ
اﻟﺒﺮﻣﺠﺔ ﻣﻦ ﻣﻌﺮﻓﺔ ﺟﻤﻴﻊ ﺟﻮاﻧﺐ اﻟﻠﻐﺔ.
وﻓﻲ اﻟﻨﻬـﺎﻳـﺔ اﺣﻤـﺪ ﷲ ﻋﻠﻰ اﻧﻬـﺎء ﻫـﺬا اﻟﻌﻤـﻞ وارﺟﻮا ان ﻳﻜﻮن ﻧـﺎﻓﻌـﺎ ً ﻻﺛﺮاء اﻟﻤﺤﺘﻮى اﻟﻌﺮﺑﻲ ﻓﻲ
ﻣﺠﺎل اﻟﺒﺮﻣﺠﺔ.
اﺣﻤﺪ اﻟﺠﻌﻴﺪ
ﻣﻌﻠﻢ ﺣﺎﺳﺐ آﻟﻲ – وزارة اﻟﺘﺮ ﺑﻴﺔ واﻟﺘﻌﻠﻴﻢ
ا ﻟﺴﻌﻮدﻳﺔ
ﺗﻮاﺻﻞaljo3aid@gmail.com :
966504511433.
Kotlinﺗﻌﻤﻞ ﻋﻠﻰ JVMوﻟﻬﺬا اﻟﺴـ ــــ ـﺒﺐ ﻧﺤﺘﺎج اﻟﻰ ﺗﺜﺒﻴﺖ JDK 8ﻋﻠﻰ ﺟﻬﺎزك .اذﻫﺐ
اﻟﻰ اﻟﻤﻮﻗﻊ اﻟﺮﺳ ـﻤﻲ ﻟ ـ ــــــــ ـﺎورا ﻛﻞ وﻗﻢ ﺑﺘﺤﻤﻴﻞ وﺗﺜﺒﻴﺖ JDK 8او اﺣﺪث .اذا ﻛﻨﺖ ﻗﺪ ﺟﻬﺰت
ﺑﻴﺌﺔ ﻟﺒﺮﻣﺠﺔ JAVAﻓﺒﻄﺒﻴﻌﺔ اﻟﺤﺎل ﻻ ﺗﺤﺘﺎج اﻟﻰ ﺗﺜﺒﻴﺖ JDKوﻟﻜﻦ ﻳﺠﺐ ان ﺗﺘﺎﻛﺪ ﻣﻦ رﻗﻢ
اﻻﺻـ ـــ ـﺪار ﻟﺪﻳﻚ ﺑﺎﺳـ ـــ ـﺘﺨﺪام اﻻﻣﺮ java -versionﻓﻲ ﻣﻮﺟﺔ اﻻواﻣﺮ ﻟﻠﻮﻧﺪوز او اﻟﻄﺮﻓﻴﺔ ﻟﻼﺟﻬﺰ
ﻳﻮﻧﻜﺲ وﻣﺎك.
ﺗﺜﺒﻴﺖ IDE
ﻳﻮﺟﺪ اﻟﻜﺜﻴﺮ ﻣﻦ ﺑﺮاﻣﺞ IDEﻋﻠﻲ ﺷـ ـﺒﻜﺔ اﻻﻧﺘﺮﻧﺖ وﻟﻜﻦ اﻟﺸـ ـﻬﻴﺮ ﻣﻨﻬﺎ ر ﺑﻤﺎ ﻳﻜﻮن ﻣﻌﺪود
ﻋﻠﻰ اﻻﺻﺎﺑﻊ ﻟﺬﻟﻚ ﺳﺄ ﻛﺘﺐ ﻟﻚ اﻻﺷﻬﺮ ﻣﻨﻬﺎ وﺗﺴﺘﻄﻴﻊ اﺧﺘﻴﺎر ﻣﺎﻳﻨﺎﺳﺒﻚ واﺳﺘﺨﺪاﻣﺔ.
ﺣﻘﻴﻘﺔ ﻓﻲ اﻟﺒﺪا ﻳﺎت اﻧﺼ ـﺢ ﺑﺎﺳ ـﺘﺨﺪام ﻣﺤﺮرات ﺷ ـﻔﺮات ﺑﺴ ـﻴﻄﺔ ﻻﺗﺪﻋﻢ اﻻﻛﻤﺎل اﻟﺘﻠﻘﺎﺋﻲ
ﻟﻴﺲ ﻟﻠﻨﻌﻘﻴـﺪ وﻟﻜﻦ ﻟﺠﻌـﻞ ﻳـﺪك ﻣﻤـﺎرﺳـ ــــــ ـﻪ ﻟﻠﻜﺘـﺎﺑـﺔ اﻟﺴـ ــــــ ـﺮ ﻳﻌـﺔ وا ﻳﻀـ ــــــ ـﺎ ً ﻟﻠﻔﻬﻢ اﻟﺠﻴـﺪ دون
اﺳﺘﺨﺪام ﺑﺮاﻣﺞ اﻻﻛﻤﺎل اﻟﺘﻠﻘﺎﺋﻲ.
ﻣﻦ اﻓﻀـ ـﻞ ﻣﺤﺮرات اﻻﻛﻮاد اﻟﺘﻲ اﺳـ ـﺘﺨﺪﻣﺘﻬﺎ ﻣﺆﺧﺮا ً وﻫﻮ vs codeﻣﺤﺮر ﺑﺴـ ـﻴﻂ وﻟﻜﻦ
ﻛﻤﻴـﺔ اﻻﺿـ ـــــــ ـﺎﻓـﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﻤﺘﺠﺮ اﻟﺨـﺎص ﻓﻴـﻪ ﺗﺠﻌـﻞ ﻣﻨـﻪ ﻣﻨـﺎﻓﺲ ﺷـ ــــــ ـﺮس ﻟﻠﺒﺮاﻣﺞ
اﻟﻜﺒﻴﺮة واﻟﻤﺘﺨﺼﺼﻪ.
vﺗﺤﻤﻴﻞ اﻟﺒﺮﻧﺎﻣﺞ
vاﺿﺎﻓﺔ Kotlin
اﻻﺿـ ـــ ـﺎﻓﺔ ﺑﺪورﻫﺎ ﺳـ ـــ ـﺘﻘﻮم ﺑﺘﺤﺪﻳﺪ اﻟﻤﺘﻐﻴﺮات ﺑﺎﻟﻮان ﻣﺨﺘﻠﻔﺔ وﺗﺮﺗﻴﺐ اﻟﺸـ ـــ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ
ﺑﺸﻜﻞ ﺟﺬاب وﺟﻤﻴﻞ.
ﻣــﺎﻳﻬﻢ اﻟﻤﺒﺮﻣﺠﻴﻦ ان ﻳﻜﻮن اﻟﻤﺤﺮر ﻣﺮ ﻳﺢ ﻟﻠﻌﻴﻦ ﻓﻨﻌﻠﻢ ﺟﻤﻴﻌـ ـﺎ ً اﻋﺘﻜـ ـﺎﻓﻨـ ـﺎ ﻋﻠﻰ اﺟﻬﺰة
اﻟﺤﺴـﺎب ﻻوﻗﺎت ﻃﻮ ﻳﻠﺔ وﻟﻜﻦ ﻫﺬا اﻟﺸـﻲ ﻣﺘﻌﺐ ﻟﻠﻌﻴﻦ ﻓﻲ ﺣﺎﻟﺔ ﻛﺎﻧﺖ اﻟﺸـﺎﺷـﺔ ﺗﺸـﻊ ﺑﺎﻟﻠﻮن
اﻻﺑﻴﺾ وﻟﺬﻟﻚ ﺳـ ـﻨﺤﺘﺎج اﻟﻰ اﺿـ ـﺎﻓﺔ ﺳـ ـﻤﺎت ﻟﻴﻠﻴﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ وﺳـ ـﺎﻗﻮم ﺑﺎﺿـ ـﺎﻓﺔ اﻟﺴـ ـﻤﺔ اﻟﺘﻲ
اﺳﺘﺨﺪﻣﻬﺎ .اﺳﻢ اﻟﺴﻤﺔAtom One Dark Theme .
ﻧﻌﻠﻢ ﺟﻤﻴﻌﺎ ً ان اي ﻟﻐﺔ ﺑﺮﻣﺠﺔ ﻳﻜﻮن ﻟﻬﺎ ا ﻳﻘﻮﻧﺔ ﺗﻮﺿــﻴﺤﻴﺔ وﺳــﻨﻘﻮم ﺑﺎﺿــﺎﻓﺘﻬﺎ ﻟﻠﺒﺮﻧﺎﻣﺞ
وذﻟﻚ ﻻﻋﻄﺎء اﻟﺒﺮﻧﺎﻣﺞ ﺷـ ــ ـﻜﻞ ﺟﻤﻴﻞ وﻣﺮﺗﺐ .اﻻﺿـ ــ ـﺎﻓﺔ ﺗﺨﻄﺖ اﻟﻤﻠﻴﻮن ﺗﺤﻤﻴﻞ ﻟﺸـ ــ ـﻌﺒﻴﺘﻬﺎ
وﺟﺬاﺑﻴﺘﻬﺎ ودﻋﻤﻬﺎ اﻟﻤﺴﺘﻤﺮ ﻣﻦ اﻟﻤﺒﺮﻣﺞ.
ﻣﻮﺟﻪ اﻷواﻣﺮ
ـــــــــــ ـ Kotlin اﻻن ﻧﺤﺘﺎج ﻟﺘﺤﻤﻴﻞ اﺿـ ـــ ـﺎﻓﺎت ﻟﻠﻨﻈﺎم ﻟﻌﻤﻞ compilerﻟﻠﺸـ ـــ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻟ ـ
ﺑﺎﺳﺘﺨﺪام ﻣﻮﺟﻪ اﻻواﻣﺮ ﻻن اﻻﺿﺎﻓﺔ ﺗﻌﺘﻤﺪ ﻋﻠﻴﻪ ﺑﺸﻜﻞ اﺳﺎﺳﻲ.
ﻳﻌﺘﺒﺮ Eclipseﻣﻦ أﻗﻮى IDEاﻟﻤﺠﺎﻧﻴﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﻻﺣﺘﻮاﺋﻪ ﻋﻠﻲ ﻣﺘﺠﺮ وإﺿـ ـــ ـﺎﻓﺎت ﻛﺜﻴﺮة
ﺗﺪﻋﻢ اﻟﻌﺪﻳﺪ ﻣﻦ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ واﻟﺪﻋﻢ اﻟﻜﺒﻴﺮ ﻣﻦ اﻟﻤﻄﻮر ﻳﻦ.
ﻧﺤﺘﺎج اﺿﺎﻓﺔ ﺑﻌﺾ اﻻدوات ﻟﻠﺒﺮﻧﺎﻣﺞ ﺣﺘﻰ ﻧﺴﺘﻄﻴﻊ اﺳﺘﺨﺪاﻣﺔ ﻓﻲ ﺑﺮﻣﺠﺔ .Kotlin
ﺗﺜﺒﻴﺖ اﻻدوات
اﻓﺘﺢ ﺑﺮﻧـﺎﻣﺞ Eclipseواذﻫـﺐ اﻟﻰ ﺧﻴـﺎر ” “Eclipse Market Placeﺳـ ــــــ ـﺘﻈﻬﺮ ﻟـﻚ ﻧـﺎﻓـﺬه
ﻣﺸﺎﺑﻬﻪ ﻟﻤﺎ ﻓﻲ اﻻﺳﻔﻞ.
ﻣﺸﺮوع Kotlin
اﻵن ﺑﻌﺪ اﻋﺎدة اﻟﺘﺸـﻐﻴﻞ ﺳـﺘﺴـﻄﻴﻊ اﺳـﺘﺨﺪام Eclipseﻓﻲ ﺑﺮﻣﺠﺔ ﻣﺸـﺎر ﻳﻊ Kotlin .ﻣﻦ
ﻗﺎﺋﻤﺔ File -> New -> Othersﺑﻌﺪ ذﻟﻚ ﻗﻢ ﺑﺎﺧﺘﻴﺎر ” “Kotlin projectﻣﻦ اﻟﻘﺎﺋﻤﺔ.
اﻫﻼ ً ﺑﺎﻟﻌﺎﻟﻢ
ﻟﻐﺔ Kotlin
أوﻻ :ﻣﻘﺪﻣﺔ
ُﺗﻌـﺪ Kotlinﻟﻐـﺔ ﺑﺮﻣﺠﻴـﺔ ﻛـﺎﺋﻨﻴـﺔ اﻟﺘﻮﺟـﻪ ﺗﻌﻤـﻞ ﻋﻠﻰ JVMوﻣﺘﻮاﻓﻘـﺔ ﻣﻊ ﺣﺰﻣـﺔ JDK
ﺑﺸــﻜﻞ ﻛﺎﻣﻞ ،ﺗﻢ اﻃﻼق وﺗﻄﻮ ﻳﺮ ﻫﺬه اﻟﻠﻐﺔ ﻋﺎم ٢٠١١م ﻣﻦ ﻗﺒﻞ ﺷــﺮﻛﺔ JetBrainsاﻟﺸـ ـﺮﻛﺔ
اﻟﻤﻄﻮرة ﻷﻛﺒﺮ وأﺷـ ـــ ـﻬﺮ ﻣﺠﻤﻮﻋﺔ IDEﻣﺴـ ـــ ـﺘﺨﺪﻣﻪ ﺣﻮل اﻟﻌﺎﻟﻢ ﻣﻊ ﻣﺨﺘﻠﻒ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ ،
وﺗﻌﺘﺒﺮ ﻟﻐﺔ ﻣﻔﺘﻮﺣﺔ اﻟﻤﺼـ ـﺪر .وﻟﻘﺪ Googleﺧﻼل ﻓﻌﺎﻟﻴﺎت ﻣﺆﺗﻤﺮ I/Oﻟﻠﻌﺎم 2017م ﺑﺪء
اﻟﺪﻋﻢ ﻟﻬﺬه اﻟﻠﻐﺔ وﺳـﻴﺘﻢ ﺗﻀـﻤﻴﻨﻬﺎ ﻓﻲ ﻧﺴـﺨﺔ Android Studio 3.0اﻟﺠﺪﻳﺪة ﺑﺪون اﻟﺤﺎﺟﺔ
ﻹﻋﺪادات اﻟﺘﺜﺒﻴﺖ اﻹﺿﺎﻓﻴﺔ.
ﺑـﺎﻟﻄﺒﻊ وﺟﻮد ﻛﻮﺗﻠﻦ ﻻ ﻳﻠﻐﻲ أﻫﻤﻴـﺔ اﻟﺠـﺎﻓـﺎ ووﺟﻮدﻫـﺎ واﺧﺘﻴـﺎرك ﻟﻠﺠـﺎﻓـﺎ أم ﻟﻠﻜﻮﺗﻠﻦ ﻳﻌﻮد
ﻟﻚ وﻟﻄﺒﻴﻌﺔ ﻋﻤﻠﻚ وﻟﻠﻔﺮ ﻳﻖ اﻟﺬي ﺗﻌﻤﻞ ﻣﻌﻪ ،أﻣﺎ ﺑﺎﻟﻤﺠﻤﻞ ﻓﺘﻌﺘﺒﺮ ﻛﻮﺗﻠﻦ ﻟﻐﺔ اﻧﺴـ ـــ ـﻴﺎﺑﻴﺔ
وﺳـﻬﻠﺔ اﻟﻔﻬﻢ وﺗﻮﻓﺮ اﻟﻮﻗﺖ واﻟﺠﻬﺪ ﻓﻤﻄﻮري اﻟﻠﻐﺔ ﺣﺮﺻـﻮ ﻋﻠﻰ ﺗﻼﻓﻲ اﻷﺧﻄﺎء وﺣﻞ ﻣﺸـﺎﻛﻞ
اﻟﺘﺮﻣﻴﺰ.
ﺳـ ــــ ـﺄﻗﺪم ﻓﻲ ﻫﺬه اﻟﺠﺰﺋﻴﺔ ﻣﻘﺪﻣﺔ ﻋﻦ ﺟﻤﻴﻊ اﻟﻌﻨﺎﺻـ ــــ ـﺮ اﻟﺘﻲ ﺗﺤﺘﺎﺟﻬﺎ ﻟﻔﻬﻢ ﺗﺮﻛﻴﺒﺔ ﺑﺮﻣﺠﺔ
ﻟﻐـﺔ Kotlinﺑـﺪا ﻳـًﺔ ﻣﻦ اﻟﻤﺘﻐﻴﺮات وﻣﺮورا ً ﻋﻠﻰ اﻟﺨﻮارزﻣﻴـﺎت اﻟﺨـﺎﺻـ ـــــــ ـﺔ ﺑﻬـﺎ اﻟـﺪوارة واﻻﺧﺘﻴـﺎر
واﻻﺣﺘﻤﺎﻻت.
ﺑﺎذن ﷲ ﺳـ ــ ـﻴﻜﻮن ﻫﻨﺎك ﺗﻔﺎﺻـ ــ ـﻴﻞ ﻣﺬﻛﻮرة وﻣﻤﻴﺰات ﺧﺎﺻـ ــ ـﺔ ﺑﻠﻐﺔ Kotlinاﻟﺘﻲ ﺗﺠﻌﻠﻬﺎ
ﺑﺪﻳﻞ ﺟﻴﺪ ﻟﻠﻐﺔ JAVAوا ﻳﻀـ ــ ـﺎ ً ﻓﻲ وﻗﺖ ﻻﺣﻖ ﺳـ ــ ـﻨﺘﻌﻠﻢ ﻛﻴﻒ ﻧﺴـ ــ ـﺘﺨﺪﻣﻬﺎ ﻣﻊ JavaScript
وا ﻳﻀـ ــــــ ـﺎ ً ﻓﻲ ﺑﺮﻣﺠـﺔ ﺗﻄﺒﻴﻘـﺎت اﻻﻧـﺪروﻳـﺪ و اﻻﻳﻔﻮن .اﻧـﺖ اﻻن ﻋﻠﻰ ﺑﻌـﺪ ﺧﻄﻮات ﺑﺴـ ــــــ ـﻴﻄـﺔ ﻣﻦ
ﻫﺎ وﺗﺠﻌـﻠﻚ
ﺣﺎﻓﺰ ـﻟﻚ ﻟﻼﻃﻼع ﻋﻠﻰ ﺗـﻔﺎﺻـ ــــــ ــﻴﻞ ﻟﻢ اذﻛﺮ ـ
اﻟـﺒﺪا ـﻳﺔ وـﺑﺈذن ﷲ ﺳـ ــــــ ـﺘﻜﻮن اـﻟﺪروس ـ
ﺗﺘﻮﺳﻊ ﻓﻲ ﺗﻌﻠﻢ اﻟﻠﻐﺔ وﻓﻖ اﺣﺘﻴﺎﺟﺎﺗﻚ.
• اﻟﻤﺘﻐﻴﺮات
• ادﺧﺎل اﻟﺒﻴﺎﻧﺎت
اﻟﻤﺘﻐﻴﺮات
ﻋﻨﺪ ﺗﻌﻠﻢ أي ﻟﻐﺔ ﻓﻼﺑﺪ ﻣﻦ اﻟﺘﻄﺮق ﻷﺳـ ـﺎﺳـ ـﻴﺎﺗﻬﺎ وﻣﻦ ﺿـ ـﻤﻦ ﻫﺬه اﻷﺳـ ـﺎﺳـ ـﻴﺎت اﻟﻤﻬﻤﺔ
ﻫﻲ ﻛﺘﺎﺑﺔ اﻟﻤﺘﻐﻴﺮات ﺑﻄﺮ ﻳﻘﺔ ﺻـ ــ ـﺤﻴﺤﺔ وﺳـ ــ ـﻨﺘﻌﺮف ﻓﻲ ﻫﺬا اﻟﺪرس ﻋﻠﻰ ﺗﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات،
واﻟﺜﻮاﺑﺖ ،وﺷﺮوط اﻟﺘﺴﻤﻴﺔ ،ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ واﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ.
اﻟﻤﺘﻐﻴﺮات ﻫﻲ ﻋﺒـﺎرة ﻋﻦ ﻗﻴﻤـﺔ ﻗـﺎﺑﻠـﺔ ﻟﻠﺘﻐﻴﻴﺮ اﺛﻨـﺎء ﻛﺘـﺎﺑـﺔ اﻟﺒﺮﻧـﺎﻣﺞ ،ﻟﺘﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات
ﻓﻲ ﻟﻐﺔ kotlinﻧﺴﺘﺨﺪام ﻛﻠﻤﺔ ،varوﺳﻨﺮى اﻷن أﺷﻜﺎل ﻣﺨﺘﻠﻔﺔ ﻟﻠﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮات.
”var myName=”Ahmed
var myAge=27
ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه ﻟﻢ ﻧﺬﻛﺮ اﻟﻨﻮع وﻟﻜﻦ اﺳـ ـﻨﺪﻧﺎ اﻟﻘﻴﻤﺔ ﻛﻴﻒ ﻳﺴـ ـﺘﻄﻴﻊ اﻟﺒﺮﻧﺎﻣﺞ ﻣﻌﺮﻓﺔ ﻧﻮع
اﻟﻤﺘﻐﻴﺮ؟ ﺑﻮاﺳﻄﺔ compilerاﻟﺬي ﻳﻘﻮم ﺑﻤﻌﺮﻓﺔ اﻟﻨﻮع ﻣﻦ ﺧﻼل اﻟﻘﻴﻤﺔ اﻟﻤﺴﻨﺪة ﻟﻪ.
اذا ﻗﻤﺖ ﺑﺎﺳ ـﻨﺎد ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﻴﺮ ﻣﻦ ﻧﻮع Intﻣﺜﻼ ً ﻓﺎﻧﻚ ﻟﻦ ﺗﺴ ـﺘﻄﻴﻊ ﺗﻐﻴﻴﺮﻫﺎ اﻟﻰ اي ﻧﻮع
آﺧﺮ.
ﻳﻤﻜﻨﻚ اﻟﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮ واﻟﺘﻌﺮ ﻳﻒ ﺑﻨﻮﻋﻪ ﻣﻊ ﻣﺮاﻋﺎة ﻛﺘﺎﺑﺔ أول ﺣﺮف ﻣﻦ ﻧﻮﻋﻪ ﺑﺤﺮف
ﻛﺒﻴﺮ.
ﻳﻤﻜﻨﻚ اﻟﺘﻌﺮ ﻳﻒ ﺑﺎﻟﻤﺘﻐﻴﺮ واﻟﺘﻌﺮ ﻳﻒ ﺑﻨﻮﻋﻪ ﻣﻊ ﻣﺮاﻋﺎة ﻛﺘﺎﺑﺔ أول ﺣﺮف ﻣﻦ ﻧﻮﻋﻪ ﺑﺤﺮف
ﻛﺒﻴﺮ ﻓﻲ ﺳﻄﺮ وﻳﻤﻜﻨﻨﺎ اﺳﻨﺎد اﻟﻘﻴﻤﺔ ﺧﻼل اﺳﻄﺮ اﻟﺒﺮﻧﺎﻣﺞ أو ﻓﻲ اﻟﺴﻄﺮ اﻟﺬي ﻳﻠﻴﻪ.
var cost:Double=12.9001111
var cost = 14.1655f
vاﻟﺜ ﻮ اﺑﺖ
ﺗﻨﻄﺒﻖ ﻋﻠﻴﻪ ﻧﻔﺲ ﻣﻮاﺻـ ـــــ ـﻔﺎت اﻟﻤﺘﻐﻴﺮات ﺑﺎﺳـ ـــــ ـﺘﺜﻨﺎء أﻧﻪ ﻗﻴﻤﺔ ﻏﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﻳﻞ أﺛﻨﺎء
اﻟﺒﺮﻧﺎﻣﺞ وﻟﺘﻌﺮ ﻳﻒ اﻟﺜﺎﺑﺖ ﻧﺴـ ـــ ـﺘﺨﺪم ﻛﻠﻤﺔ ، valﻳﻤﻜﻨﻨﺎ اﻻﺳـ ـــ ـﺘﻔﺎدة ﻣﻨﻪ ﻓﻲ ﺗﻌﺮ ﻳﻒ اﻟﻘﻮاﻧﻴﻦ
اﻟﺮ ﻳـﺎﺿـ ــــــ ـﻴـﺔ أو ﻟﻮ ﻛـﺎن ﻫﻨـﺎﻟـﻚ رﻗﻢ وﻇﻴﻔﻲ ﻓﻬﻮ ﺛـﺎﺑـﺖ ﺑـﺎﻟﻄﺒﻊ ﻻ ﻳﻤﻜﻦ ﺗﻐﻴﻴﺮه آو رﻗﻢ اﻟﻬﻮﻳـﺔ
اﻟﻮﻃﻨﻲ.
val id:Int=601121
id = 1234 // Error
ر ﺑﻤﺎ ﻛﺘﺒﺖ ﻣﺘﻐﻴﺮ واردت ﺗﺤﻮﻳﻞ اﻟﻰ اي ﻧﻮع آﺧﺮ ﻓﺎﻧﻚ ﻟﻦ ﺗﺴـﺘﻄﻴﻊ ذﻟﻚ ﺑﺴـﺒﺐ اﻧﻚ ﻗﺪ
ﺣـﺪدت ﻧﻮع اﻟﻤﺘﻐﻴﺮ او ان Compilerﻗـﺪ ﻗـﺎم ﺑﺘﺤـﺪﻳـﺪ ﻧﻮع اﻟﻤﺘﻐﻴﺮ اذا ﻛـﺎن اﺳـ ــــــ ـﻨـﺎد اﻟﻘﻴﻤـﺔ
ﺑﺸ ـﻜﻞ ﻣﺒﺎﺷ ـﺮ .ﺗﺤﻮﻳﻞ اﻟﻤﺘﻐﻴﺮات اﺑﺴ ـﻂ ﻣﻤﺎ ﺗﺘﺨﻴﻞ ﻟﻦ ﺗﺤﺘﺎج اﻟﻰ ا ﻛﺜﺮ ﻣﻦ ﺳ ـﻄﺮ او ذا ﻛﺮة
ﻛﺒﻴﺮه ﻟﺤﻔﻆ اﻟﻄﺮ ﻳﻘﺔ .ﺗﺎﺑﻊ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ.
.)( وﺑﺸﻜﻞ ﺳﻠﺲ وﺑﺴﻴﻂtoLong ﺑﺎﺳﺘﺨﺪام داﻟﺔLong اﻟﻰInt ﻻﺣﻆ ﻗﻤﻨﺎ ﺑﺘﺤﻮﻳﻞ
toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()
ﻧﺮى ﻫﻨﺎ اﻟﻔﺮق اﻟﻮاﺿـ ـــــ ـﺢ ﺑﻴﻨﻬﺎ وﺑﻴﻦ ﻟﻐﺔ اﻟﺠﺎﻓﺎ ﻣﻦ ﺣﻴﺚ اﻻﺧﺘﺼـ ـــــ ـﺎر اﻟﺸـ ـــــ ـﺪﻳﺪ ﻓﻲ ﻛﺘﺎﺑﺔ
اﻟﺪاﻟﺔ واﻟﻮاﺿﺢ ﻓﻲ ﻛﺘﺎﺑﺔ ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ أ ﻳﻀﺎ.
ﺟﻤﻠـﺔ اﻟﻄﺒـﺎﻋـﺔ ﺗﻜﺘـﺐ ﺑﻄﺮ ﻳﻘﺘﻴﻦ اﻣـﺎ printاو printlnاﻟﻔﺮق اﻟﻮﺣﻴـﺪ ﺑﻴﻨﻬﻤـﺎ ان اﻷﺧﻴﺮة
ﺗﺴﻤﺢ ﺑﺘﺮك ﺳﻄﺮ اﺳﻔﻞ اﻟﺠﻤﻠﺔ اﻟﻤﻄﺒﻮﻋﺔ.
vﻣ ﺜﺎل
ﻓﻲ ﺟﻤﻠـﺔ اﻟﻄﺒـﺎﻋـﺔ ﻫـﺬه أردﻧـﺎ ﻛﺘـﺎﺑـﺔ ﺟﻤﻠـﺔ وﻣﻦ ﺛﻢ اﻟﻤﺘﻐﻴﺮ اﻟـﺬي ﻳﺤﻤـﻞ ﻗﻴﻤﺘﻬـﺎ وﻓﺼـ ــــــ ـﻠﻨـﺎ
ﺑﻴﻨﻬﻤﺎ ﺑﻌﻼﻣﺔ ، +ﻫﻨﺎﻟﻚ أ ﻳﻀﺎ ً ﻃﺮ ﻳﻘﺔ أﺧﺮى ﺳﻨﺘﻌﺮف ﻋﻠﻴﻬﺎ وﻫﻲ :
اد ﺧ ﺎل اﻟﺒﻴﺎﻧﺎت
ﻧﺴـ ــــــ ـﺘﺨـﺪم ﻫـﺬه اﻟـﺪاﻟـﺔ ﻋﻨـﺪﻣـﺎ ﻧﺮ ﻳـﺪ اﺳـ ــــــ ـﺘﻘﺒـﺎل ﻗﻴﻤـﺔ ﻣﻦ اﻟﻤﺴـ ــــــ ـﺘﺨـﺪم ،ﻣﺜﻼ ﻃﻠﺒـﺖ ﻣﻦ
اﻟﻤﺴـﺘﺨﺪم أن ﻳﺪﺧﻞ اﺳـﻤﻪ و ﻋﻤﺮه واﻟﻤﺮﺣﻠﺔ اﻟﺪراﺳـﻴﺔ ﻓﻬﻨﺎ ﻧﻘﻮم ﺑﺎﺳـﺘﺨﺪام ﻫﺬه اﻟﺪاﻟﺔ ﻛﻤﺎ
ﺳﻨﺮى.
ﻓﻲ اﻟﻤﺜﺎل أﻋﻼه ﻃﻠﺒﻨﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم أن ﻳﺪﺧﻞ اﺳﻤﻪ ﻣﻦ ﺧﻼل ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ ،وﻣﻦ ﺛﻢ
ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ وﺣﺪدﻧﺎ ﻧﻮﻋﻪ وﻗﻤﻨﺎ ﺑﺈﺳﻨﺎد اﻟﺪاﻟﺔ اﻟﺘﻲ ﺗﻘﻮم ﺑﺎﺳﺘﻘﺒﺎل ﻫﺬه اﻟﻘﻴﻤﺔ.
ﺛﺎﻧﻴﺎ :اﻟﺘﺤﻮﻳﻞ
readLineﻫﺬه اﻟﺪاﻟﺔ ﺗﺴـ ـــ ـﺘﻘﺒﻞ ﻗﻴﻤﺔ ﻓﻘﻂ ﻧﺼـ ـــ ـﻴﺔ أي ﻣﻦ ﻧﻮع ،Stringوﻟﻜﻦ ﻓﻠﻨﻔﺮض
أﻧﻨﺎ أردﻧﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم إدﺧﺎل ﻋﻤﺮه واﻟﻌﻤﺮ ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﺻﺤﻴﺢ ،ﻣﺎ اﻟﻌﻤﻞ إذا ؟
ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ اﻟﻌﻤﺮ ﻣﻦ ﻧﻮع ﻋﺪد ﺻـ ـــــ ـﺤﻴﺢ وﻣﻦ ﺛﻢ ﻗﻤﻨﺎ ﺑﺈﺳـ ـــــ ـﻨﺎد اﻟﺪاﻟﺔ ﻟﺘﻘﻮم ﺑﻘﺮاءة ﻣﺎ
ﻳﺪﺧﻠﻪ اﻟﻤﺴﺘﺨﺪم وﻣﻦ ﺛﻢ ﻗﻤﻨﺎ ﺑﺎﻟﺨﻄﻮة اﻟﺠﺪﻳﺪة اﻟﺘﺎﻟﻴﺔ وﻫﻲ اﻟﺘﺤﻮﻳﻞ :
)(.toInt
ﻫـﺬا اﻟﺴـ ــــــ ـﻄﺮ ﻳﻌﻨﻲ أن ﻧﻘﻮم ﺑﺘﺤﻮﻳـﻞ اﻟﻌﻤﺮ ﻣﻦ ﻣﺘﻐﻴﺮ ﻧﺼـ ــــــ ـﻲ إﻟﻰ ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﻋـﺪد
ﺻﺤﻴﺢ وذﻟﻚ ﻷن داﻟﺔ
)(Age.toFloat
ﻫﻨﺎ ﻟﻮ أردﻧﺎ اﻟﺘﺤﻮﻳﻞ إﻟﻰ ﻣﺘﻐﻴﺮ ﻧﻮﻋﻪ ﻋﺪد ﻋﺸﺮي ﻣﺰدوج :
)(Age.toDouble
وﻟﻠﺘﻌﻠﻴﻘـﺎت ﻧﻮﻋـﺎن اﻣـﺎ ان ﺗﻜﻮن ﺳـ ــــــ ـﻄﺮ ﻳـﺔ أي ﺗﻌﻠﻴﻖ ﻓﻲ ﺳـ ــــــ ـﻄﺮ واح ﻓﻘﻂ أو ﻣﺘﻌـﺪدة
اﻷﺳﻄﺮ ،ﻣﺜﺎل:
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 length:Int=5
var width:Int=7
var distance=length * width
)println(distance
)var circumference= 2*(length+width
)println(circumference
var num=9
)println(num
num *=3
)println(num
var num1=5
)println(num1
num1++
)println(num1
num=num+1
num1++
ﻟﻮ أردﻧﺎ ﻃﺮح ﻋﺪد واﺣﺪ ﻣﻦ ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ ﺳـ ـــــ ـﻮف ﻧﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟﻨﻘﺼـ ـــــ ـﺎن أو ﻣﺎ ﺗﻌﺮف
ﺑـ Decrement
var num1=5
)println(num1
num1--
)println(num1
ﻓﻲ اﻟﺒـﺪا ﻳـﺔ ﻧﺤـﺐ أن ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻒ اﻟﻌﻤﻠﻴـﺎت اﻷﺳـ ـــــــ ـﺎﺳـ ــــــ ـﻴـﺔ وﻫﻲ :اﺻـ ــــــ ـﻐﺮ ،ا ﻛﺒﺮ ،اﻟﻨﻔﻲ،
اﻟﻤﺴﺎواة.
اﻟﻌﻤﻠﻴﺔ اﻟﺮﻣﺰ
اﺻﻐﺮ <
ا ﻛﺒﺮ >
اﺻﻐﺮ ﻣﻦ او ﻳﺴﺎوي >=
ا ﻛﺒﺮ ﻣﻦ او ﻳﺴﺎوي <=
ﻳﺴﺎوي ==
ﻋﻼﻣﺔ اﻟﻨﻔﻲ !
ﻻ ﻳﺴﺎوي =!
vأﻣ ﺜ ﻠﺔ
ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ:
true
§ ﻋﺮﻓﻨــﺎ ﻣﺘﻐﻴﺮ ﻣﻨﻄﻘﻲ ﻳﺤﻤــﻞ ﻗﻴﻤــﺔ falseوﻟﻜﻦ ﻧﻼﺣﻆ وﻗــﺖ اﻟﻄﺒــﺎﻋــﺔ ﻧﻔﻴﻨــﺎ
اﻟﻘﻴﻤﺔ أي اﻧﻪ ﺳﻴﻄﺒﻊ اﻟﻌﻜﺲ.
var isReal:Boolean=false
)println ("Ahmed loves Kotlin :"+ !isReal
ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ:
vﺑﻮاﺑﺔ AND
ﻟﺬﻟﻚ ﻧﺴـ ــــــ ـﺘﺨﺪﻣﻬﺎ ﻛﺜﻴﺮا ﻓﻲ اﻟﺘﺤﻘﻖ ﻣﻦ اﺳـ ــــــ ـﻢ اﻟﻤﺴـ ــــــ ـﺘﺨﺪم وﻛﻠﻤﺔ اﻟﻤﺮور ﻋﻨﺪﻣﺎ ﻳﻘﻮم
اﻟﻤﺴـ ـــ ـﺘﺨﺪم ﻣﻦ ادﺧﺎل اﻟﻤﻌﺮف اﻟﺨﺎص ﺑﻪ وﻛﻠﻤﺔ اﻟﻤﺮور اﻟﺨﺎﺻـ ـــ ـﺔ أ ﻳﻀـ ـــ ـﺎ ﺑﻪ وﻛﺎﻧﺘﺎ ﻛﻠﺘﺎﻫﻤﺎ
ﺻـ ــــــ ـﺤﻴﺤﺘـﺎن ﺣﻴﻨﻬـﺎ ﻳﻜﻮن اﻟﻨـﺎﺗﺞ ﻟـﺪﻳﻨـﺎ trueﺑـﺪاﺧـﻞ اﻟﺒﺮﻧـﺎﻣﺞ وﻧـﺎﺗﺞ اﻟﺘﻨﻔﻴـﺬ ﻫﻮ اﻟـﺪﺧﻮل إﻟﻰ
اﻟﺒﺮﻧﺎﻣﺞ وﻟﻜﻦ ﻓﻲ ﺣﺎل اﻧﻪ ادﺧﻞ اﻟﻤﻌﺮف اﻟﺨﺎص ﺑﻪ ﺑﺸـ ـﻜﻞ ﺻـ ـﺤﻴﺢ واﺧﻄﺎء ﻓﻲ ﻛﺘﺎﺑﺔ ﻛﻠﻤﺔ
اﻟﻤﺮور ﻓـﺎﻟﻨـﺎﺗﺞ ﺑـﺎﻟـﺪاﺧـﻞ ﺳـ ــــــ ـﻴﻜﻮن ﺧﻄـﺎء وﻧـﺎﺗﺞ اﻟﺘﻨﻔﻴـﺬ اﻟـﺬي ﻧﺮاه ﻟﻦ ﻳﺴـ ــــــ ـﻤﺢ ﻟﻲ ﺑـﺪﺧﻮل
اﻟﺒﺮﻧﺎﻣﺞ.
وﻓﻲ اﻟﻤﺜﺎل ﻧﺠﺪ أﻧﻪ ﻟﺪي ﻗﻴﻤﺘﻴﻦ ار ﻳﺪ اﻟﺘﺤﻘﻖ ﻣﻨﻬﻤﺎ ﻛﻠﻬﻤﺎ ﺑﺄﻧﻬﻤﺎ ﻳﻌﻴﺪان ﻟﻲ .true
output : true
vﺑﻮاﺑﺔ OR
اذا ﻛـﺎن اﺣـﺪﻫﻤـﺎ ﺻـ ــــــ ـﺤﻴﺢ ﻋﻠﻰ اﻷﻗـﻞ ﻓﻬﻲ ﺗﻌﻴـﺪ trueاذا ﻻ ﺗﺸـ ــــــ ـﺘﺮط ان ﻳﻜﻮن ﻛﻼﻫﻤـﺎ
ﺻﺤﻴﺢ ﻛﻤﺎ ﻓﻲ .AND
output : true
vﺑﻮاﺑﺔ NOT
vﺟﺪول ﻣﻘﺎرﻧﺔ
ﻻ ﻳﺨﻔﻰ ﻋﻠﻴﻨﺎ أن اﻟﺴـ ـﻼﺳـ ـﻞ اﻟﻨﺼـ ـﻴﺔ ﻫﻴﺎ ﻣﻦ أﻫﻢ اﻟﻤﺪﺧﻼت واﻟﻤﺨﺮﺟﺎت أ ﻳﻀـ ـﺎ ً ﻓﻲ أي
ﻟﻐﺔ ﻧﺘﻌﻠﻤﻬﺎ ،ﻛﻴﻒ ﻧﺴـ ـﺘﻄﻴﻊ اﻟﺘﻌﺎﻣﻞ ﻣﻌﻬﺎ ﺑﺎﻟﺤﺬف ،اﻹﺿـ ـﺎﻓﺔ ،اﺧﺘﺒﺎرﻫﺎ وﺣﺘﻰ اﻟﺘﻌﺎﻣﻞ ﻣﻊ
اﻷﺣﺮف وﺳﻮف ﻧﺘﻄﺮق ﻟﻬﺬا اﻟﺤﺪث ﻓﻲ درﺳﻨﺎ اﻟﻴﻮم.
"var name:String="Ahmed
)println(name
ﻓﻲ ﻫﺬا اﻟﻤﺜﺎل اﻟﺒﺴـ ــ ـﻴﻂ ﻗﻤﻨﺎ ﺑﻄﺒﺎﻋﺔ اﻻﺳـ ــ ـﻢ اﺣﻤﺪ ،اﻷن ﺳـ ــ ـﻨﺴـ ــ ـﺘﻌﺮض أﻫﻢ اﻟﺪوال اﻟﺘﻲ
ﺗﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺴﻼﺳﻞ اﻟﻨﺼﻴﺔ ﻣﺴﺘﺨﺪﻣﻴﻦ اﻟﻤﺜﺎل اﻟﺤﺎﻟﻲ:
length v
"var name:String="Ahmed
)println(name.length
plus v
"var name:String="Ahmed
))"println(name.plus(" aljuaid
get v
"var name:String="Ahmed
))println(name.get(3
equals v
اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة ﻣﻦ اﻟﺪاﻟﺔ ﻫﻴﺎ ﻣﻨﻄﻘﻴﺔ ﻓﻬﻲ ﺗﺴ ـﺘﺨﺪم ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺗﻄﺎﺑﻖ اﻟﻘﻴﻢ وﺳ ـﻮف
ﻧﺮى ذﻟﻚ ﺑﺎﻟﻤﺜﺎل.
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())
"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
اﻟﻤ ﺼ ﻔ ﻮ ﻓ ﺎت
اﻟﻤﺼـﻔﻮﻓﺎت ﺗﻌﺘﺒﺮ اﻟﺤﻞ اﻟﺴـﺤﺮي إذا ﻛﻨﺖ ﺗﺮ ﻳﺪ ادﺧﺎل او ﻃﺒﺎﻋﺔ ﺑﻴﺎﻧﺎت ﻛﺜﻴﺮة ،ﻓﺮﺋﻴﺲ
اﻟﻘﺴـ ـــﻢ ﻳﺴـ ـــﺘﻄﻴﻊ ﺣﺼـ ـــﺮ ﺑﻴﺎﻧﺎت ﻣﻦ ﻫﻢ ﻓﻲ ﻗﺴـ ـــﻤﻪ داﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻋﻦ ﻃﺮ ﻳﻖ اﻟﻤﺼـ ـــﻔﻮﻓﺔ ،
ﻛﺬﻟﻚ اﻟﻤﻌﻠﻢ ﻳﺴﺘﻄﻊ ﻃﺒﺎﻋﺔ ﺑﻴﺎﻧﺎت اﻋﺪاد ﻛﺒﻴﺮة ﻣﻦ ﻃﻠﺒﺘﻪ ﻓﻘﻂ ﺑﻀﻐﻄﺔ اﻟﺰر ،واﻟﻤﺼﻔﻮﻓﺔ
ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻃﺮ ﻳﻘﺔ ﺗﻌﺮ ﻳﻔﻬﺎ وﺗﻌﺒﺌﺘﻬﺎ
ﻣﻌﺮوف أﻧﻬﺎ ﻣﺠﻤﻮﻋﺔ ﺑﻴﺎﻧﺎت ﻣﻦ ﻧﻔﺲ اﻟﻨﻮع .ـ
وﻃﺒﺎﻋﺘﻬﺎ:
}var myArray=Array<Int>(5){0
ﺣﺴﻨﺎ ً اﻷن ﻋﺮﻓﻨﺎ ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ أر ﻳﺪ إدﺧﺎل ﻗﻴﻢ ﺑﺪاﺧﻠﻬﺎ أي ﺗﻌﺒﺌﺘﻬﺎ ،ﻧﺴﺘﻄﻴﻊ ﺗﻌﺒﺌﺘﻬﺎ
ﺑﻬﺬه اﻟﻄﺮ ﻳﻘﺔ
myArray[0]=12
وﻟﻜﻦ ﻫﺬه اﻟﻄﺮ ﻳﻘﺔ ﺳـ ـﺘﻜﻮن ﻣﺮﻫﻘﺔ ﻟﻮ ﻛﺎﻧﺖ اﻟﻤﺼـ ـﻔﻮﻓﺔ ﻟﺪي ﻃﻮ ﻳﻠﺔ أي ﺗﺤﻤﻞ ﻋﻨﺎﺻـ ـﺮ
ﻛﺜﻴﺮة ،واﻟﺤﻞ اﻟﺴﺤﺮي ﻛﺎﻟﻌﺎدة ﻫﻮ اﺳﺘﺨﺪام اﻟﺪوارة أو ، loopﻓﻘﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام : for loop
ﻃﺒﻌـﺎ ً ﻫـﺬا اﻟﻤﺜـﺎل اﻟـﺬي ﺳـ ــــــ ـﻮف ﻧﻄﺮﺣـﻪ ﻫﻮ ﻟﻮ أﻧﻨـﺎ أردﻧـﺎ ﻃﺒـﺎﻋـﺔ اﻷرﻗـﺎم ﻣﻦ ٤-٠ﺑـﺎﻟﺘﺮﺗﻴـﺐ
ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ:
)for(i in 0..5
{
myArray[i]=i
)]println(myArray[i
}
أوﻻ ً :
ﺛﺎﻧﻴﺎ ً :
myArray[0]=0
myArray[1]=1
…
ﺛﺎﻟﺜﺎ ً :
0
1
2
3
4
ﺣﺴﻨﺎ ً وﻟﻜﻦ ﻟﻮ أردﻧﺎ ﻣﻦ اﻟﻤﺴﺘﺨﺪم ﺗﻌﺒﺌﺔ ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ ؟ اﻟﺤﻞ ﺑﺴﻴﻂ ﺟﺪا ً :
{ )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
: § ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
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(i in 0..4
)]println(student[i
}
ﻫـﻨﺎ ﻋﺮﻓـﻨﺎ ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﺳـ ــــــ ـﻠﺴـ ــــــ ـﻠﺔ ﻧﺼـ ــــــ ـﻴﺔ ﻷﺳـ ــــــ ـﻤﺎء اﻟﻄﻼب ﻣﻊ ﻣﺮاﻋﺎة } “”{ اﻟﻘﻴﻤﺔ
اﻻﻓﺘﺮاﺿ ـﻴﺔ ﻫﻨﺎ ﻻ ﻧﺴ ـﺘﻄﻴﻊ ﻛﺘﺎﺑﺘﻬﺎ ٠أو أي ارﻗﻢ وذﻟﻚ ﻷن اﻟﻤﺼ ـﻔﻮﻓﺔ ﻧﺼ ـﻴﺔ ﻓﻨﻘﻮم ﺑﻮﺿ ـﻊ
ﻋﻼﻣﺘﻲ اﻟﺘﻨﺼـ ــــــ ـﻴﺺ وﻧ ـﺪﻋﻬ ـﺎ ﻓ ـﺎرﻏ ـﺔ ،ﻛﻤ ـﺎ ﺗﺮون ﻫﻮ ﻧﻔﺲ اﻷﻣﺮ اﺣﺘﺠﻨ ـﺎ إﻟﻰ دوارﺗ ـﺎن اﻷوﻟﻰ
ﻹدﺧﺎل اﻷﺳﻤﺎء ﻣﻦ اﻟﻤﺴﺘﺨﺪم واﻷﺧﺮى ﻟﻄﺒﺎﻋﺔ ﺑﻴﺎﻧﺎت ﻫﺬه اﻟﻤﺼﻔﻮﻓﺔ.
ﺑﺎﻟﻄﺒﻊ اذا ﻛﺎن ﻟﺪي ﻣﺼـ ـــ ـﻔﻮﻓﺔ وﻫﻲ ﺗﺠﻤﻊ ﻛﺒﻴﺮ ﻟﻠﺒﻴﺎﻧﺎت ﻓﺴـ ـــ ـﻨﺤﺘﺎج إﻟﻰ دوال ﺳـ ـــ ـﺮ ﻳﻌﺔ
وﺟـﺎﻫﺰة ﻟﻠﺘﻌـﺎﻣـﻞ ﻣﻊ ﻫـﺬه اﻟﻤﺼـ ــــــ ـﻔﻮﻓـﺔ ،ﻓﻲ اﻟﺠـﺪول ادﻧـﺎه اﺷـ ــــــ ـﻬﺮ اﻟـﺪوال اﻟﻤﺴـ ــــــ ـﺘﺨـﺪﻣـﺔ
ﻟﻠﻤﺼﻔﻮﻓﺔ:
اﻟﻨﻄ ﺎق
اﻟﺤﺪود او اﻟﻨﻄﺎق ﻣﻦ اﻟﻤﺴـ ـــــ ـﻤﻰ ﻧﻌﻠﻢ او ﻧﻔﻬﻢ ان ﻟﻬﺎ ﻗﻴﻤﺔ ﺑﺪا ﻳﺔ وﻗﻴﻤﺔ ﻧﻬﺎﻳﺔ ﻣﺤﺪودة
وﺑﺪاﺧﻠﻬﺎ ارﻗﺎم او ﺣﺮوف اﻟﺦ.
أوﻻ :اﻟﻨﻄﺎق
vأﻣ ﺜ ﻠﺔ
var evenNumbers=1..20
output : 2 4 6 8 10 ..20
not found
var letter:Char='b'
if(letter in word){
println("the value in the word")
not found
اﻟﻘﻔﺰة ﻫﻮ ﺑﻤﻌﻨﻰ ﻳﻜﻮن ﻟﺪي ﻧﻄﺎق وﻟﻜﻦ ار ﻳﺪ ﻋﻨﺎﺻـﺮ ﻣﻌﻴﻨﺔ ﺗﺒﻌﺪ ﻋﻦ ﺑﻌﻀـﻬﺎ ﺑﻤﺴـﺎﻓﺔ
ﺛـﺎﺑﺘـﻪ ،ﺑﻤﻌﻨﻰ أﺧﺮ ﻧﻌﻠﻢ أن اﻷرﻗـﺎم اﻟﺰوﺟﻴـﺔ ﺗﺒﻌـﺪ ﻋﻦ ﺑﻌﻀـ ــــــ ـﻬـﺎ رﻗﻤﻴﻦ ﻓﻌﻨـﺪﻣـﺎ اﻋﻤـﻞ ﻗﻔﺰ ﻓﻲ
اﻟﻨﻄﺎق اﺳﺘﻄﻴﻊ اﻟﻮﺻﻮل إﻟﻴﻪ.
output : 2 4 6 8 10 ..20
downTo v
until v
ﻫﻨـﺎ ﻳﺒـﺪأ ﻳﻄﺒﻊ ﻣﻦ رﻗﻢ ١وﻳﺘﻮﻗﻒ ﻋﻨـﺪ ، ٩وذﻟـﻚ ﻷن 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
ﻳﻘﺼـ ــــــ ـﺪ ﺑﺮؤﻳﺔ اﻟﻤﺘﻐﻴﺮات وﻫﻲ ﻣﺠﺎل رؤ ﻳﺘﻬﺎ ﻓﻲ اﻟﻤﺸـ ــــــ ـﺮوع وﻟﻜﻲ ﻧﻌﺮﻓﻬﺎ ﻻﺑﺪ أن ﻧﻌﺮف
أﻧﻮاع اﻟﻘﻴﻮد ﻋﻠﻰ اﻟﻤﺘﻐﻴﺮات:
اﻟ ـﺪوال واﻟﻤﺘﻐﻴﺮات اﻟ ـﺬي ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻔﻬ ـﺎ داﺋﻤ ـﺎ ﻫﻲ ﺑ ـﺎﻷﺳـ ــــــــ ـﺎس 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
وﺿـ ـﻊ ﻗﻴﻮد ﻋﻠﻰ اﻟﻤﺘﻐﻴﺮات ﺗﺠﻌﻞ اﻟﻮﺻـ ـﻮل إﻟﻰ ﻫﺬه اﻟﻤﺘﻐﻴﺮات ﺳـ ـﻬﻞ ،ﻓﻤﺜﻼ ﻟﻮ أردت
أن أﻋﺮف ﻣﺠﻤﻮﻋﺔ ﻣﺘﻐﻴﺮات وأر ﻳﺪ ﻓﻘﻂ أن أﺻـ ــــــ ﻞ إﻟﻰ ﻣﺘﻐﻴﺮ واﺣﺪ ﻓﻲ اﻟﻤﺸـ ــــــ ﺮوع ﻛﻜﻞ ﻫﻨﺎ
ﻧﺴﺘﻄﻴﻊ وﺿﻌﻪ ﻋﺎم ﻟﻨﺘﻤﻜﻦ ﻣﻦ رؤ ﻳﺘﻪ ﻓﻲ ﻛﺎﻓﺔ أﺟﺰاء اﻟﻤﺸﺮوع ،وﺑﻘﻴﺔ اﻟﻤﺘﻐﻴﺮات ﻧﺴﺘﻄﻴﻊ
ﺗﻌﺮ ﻳﻔﻪ ﻋﻠﻰ ﺣﺴـﺐ اﺳـﺘﺨﺪاﻣﻬﺎ ﻫﻞ ﻓﻘﻂ ﺳـﺄ ﻛﺘﻔﻲ ﺑﺄن ﻳﻜﻮن اﻟﻤﺘﻐﻴﺮ ﻓﻲ اﻟﺘﺼـﻨﻴﻒ اﻟﻮارث
أو ﻓﻲ moduleاﻟﺤﺎﻟﻲ.
ESCAPE SEQUENCE
ﻫﻲ رﻣﻮز ﺗﺴـ ــــ ـﺎﻋﺪﻧﺎ اﺛﻨﺎء ﻛﺘﺎﺑﺔ اﻷواﻣﺮ اﻟﺒﺮﻣﺠﻴﺔ ﻋﻠﻰ أداء أﻣﺮ ﻣﻌﻴﻦ ،ﻣﺜﻞ :ﻧﺰول ﺳـ ــــ ـﻄﺮ،
ﺗﺮك ﻣﺴﺎﻓﺔ ﻣﻌﻴﻨﺔ ،اﻟﺒﺪء ﻣﻦ أول اﻟﺴﻄﺮ …إﻟﺦ.
vاﻟﺮ ﻣ ﺰ \ n
)"print("Hello World\n
vاﻟﺮ ﻣ ﺰ \ t
vاﻟﺮ ﻣ ﺰ \ b
vاﻟﺮ ﻣ ﺰ \ r
ﺗﻘﻮم ﺑﻤﺴـﺢ اﻟﺴـﻄﺮ ﻛﺎﻣﻼ ﻟﻮ وﺿـﻌﺖ اﺧﺮ اﻷﻣﺮ ،وﻟﻮ ﻛﺎن ﻓﻲ اﻣﺮ ﻃﺒﺎﻋﺔ ﻣﺜﻼ ووﺿـﻌﺘﻪ ﻓﻲ
اﻟﻤﻨﺘﺼـﻒ ﻳﻤﺴـﺢ ﻣﺎ ﻗﺒﻠﻪ ،ﻧﺴـﺘﻄﻴﻊ اﻻﺳـﺘﻔﺎدة ﻣﻦ ﻫﺬا اﻷﻣﺮ ﻓﻲ ﻋﻤﻠﻴﺔ ﺗﺤﺘﺎج إﻟﻰ اﻟﻌﺪ ﻣﺜﻼ
ﻟﻮ اردﻧـﺎ ﻗﻴـﺎس ﻧﺴـ ــــــ ـﺒـﺔ ﺗﺤﻤﻴـﻞ ﺑﺮﻧـﺎﻣﺞ ﻣﻌﻴﻦ أﻻ ﻳﻈﻬﺮ ﻟﻨـﺎ ﻓﻲ اﻟﺒـﺪا ﻳـﺔ … ٪٤٠، ٪١٩ ، ٪١٥إﻟﺦ
وﻫﻜﺬا ﻧﻤﺴﺢ اﻟﻌﺪد وﻧﻀﻊ ﻋﺪد ﺟﺪﻳﺪ ﻟﻠﺘﻘﺪم:
{)for(x in 1..800
vاﻟﺮ ﻣ ﺰ ' \
vاﻟﺮ ﻣ ﺰ " \
vاﻟﺮ ﻣ ﺰ \ $
vاﻟﺮ ﻣ ﺰ \ \
)"println("hello \\ welcome
UNICODE
ﺗﺘﻨﻮع اﻟﺮﻣﻮز واﻟﺤﺮوف اﻟﻤﺴـﺘﺨﺪﻣﺔ ﻣﻦ ﺑﻠﺪ ﻷﺧﺮ واﻟﻴﻮﻧﻴﻜﻮد ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺷـﻔﺮة ﺧﺎﺻـﺔ
ﻟﺤﺮوف ورﻣﻮز ﻣﺨﺼﺼﺔ ﻛﻤﺎ ﻫﻮ ﻣﻮﺿﺢ ﻓﻲ اﻟﺼﻮرة اﻟﺘﺎﻟﻴﺔ:
ﺑﻤﺠﺮد اﻟﻮﻗﻮف ﻋﻠﻰ اﻟﺮﻣﺰ واﻟﻀﻐﻂ ﻇﻬﺮ ﻟﻨﺎ ﻣﺮ ﺑﻊ اﺧﺘﺼﺎر ﻓﻴﻪ اﻟﻤﻌﻠﻮﻣﺎت اﻟﺘﻲ ﻧﺤﺘﺎﺟﻬﺎ
وﻧﻼﺣﻆ رﻣﺰ Unicodeﻇﻬﺮ ﻟﻨﺎ.
{)>fun main(args:Array<String
fun main(args:Array<String>){
var e1='\u0200'
var e2='\u0218'
: § ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
Ȁ
ȁ
Ȃ
ȃ
Ȅ
ȅ
Ȇ
ȇ
Ȉ
ȉ
: ﻣﺜﺎل، اﻟﺨﺎص ﺑﻪUnicode ﻟﻮ أردت ﻛﻤﺴﺘﺨﺪم أن ﺗﻘﻮم ﺑﺈدﺧﺎل ﺣﺮف ﻣﻌﻴﻦ ﻟﻤﻌﺮﻓﺔ
fun main(args:Array<String>){
println("enter any character :")
var ch:Char = readLine()!!.single()
println("unicode of this character is : ${ch.toInt()}")
}
${toInt()}
fun main(args:Array<String>){
Ahmed1431@gmail.com
§ \d
ﻣﺨﺼـ ــــــ ـﺺ ﻹدﺧـﺎل رﻗﻢ ﻣﻦ ٩-٠ﻓﻘﻂ أي ﻟﻮ ﻗﻤـﺖ ﺑـﺈدﺧـﺎل أي ﺣﺮف او رﻣﺰ ﺳـ ــــــ ـﺘﻜﻮن
اﻟﻨﺘﻴﺠﺔ .false
§ \w
ﻹدﺧﺎل أي ﻣﻦ اﻟﻘﻴﻢ اﻟﺘﺎﻟﻴﺔ : a-z ,A-Z ,0-9اﻟﺤﺮوف ﺳـﻮاء ﻛﺎﻧﺖ ﻛﺒﻴﺮة أو ﺻـﻐﻴﺮة وأي
رﻗﻢ ﻣﻦ .٩-٠
§ \s
ﻟﻄﺒﺎﻋﺔ ﻣﺴﺎﻓﺔ.
§ ][
§ }{
ﻧﺴﺘﺨﺪﻣﻬﺎ ﻟﺘﺤﺪﻳﺪ ﻋﺪد اﻟﺨﺎﻧﺎت اﻟﻤﺪﺧﻠﺔ ﻓﻤﺜﻼ ﺑﻌﺪ ﻃﻠﺒﻚ ﻣﻦ اﻟﻤﺴﺘﺨﺪم ادﺧﺎل اﺳﻤﻪ
ﺳـ ــــ ـﻨﻘﻮم ﺑﺘﺤﺪﻳﺪ ﻋﺪد اﻟﺤﺮوف اﻟﻤﺪﺧﻠﺔ ﺑﺤﻴﺚ أن اﺳـ ــــ ـﻤﻪ ﻻ ﻳﺘﺠﺎوز ٢٠ﺣﺮف وﻻ ﻳﻘﻞ ﻋﻦ ٥
ﻣﺜﻼ ﻫﻜﺬا:
}[a-z]{5,20
§ \*
ﻟﻮ أردت أن ﻳﻘﻮم اﻟﻤﺴـ ــــ ـﺘﺨﺪم ﺑﺈدﺧﺎل ﺧﺎﻧﺎت ﻛﺜﻴﺮة وﻓﻲ ﺣﺎل أ ﻳﻀـ ــــ ـﺎ ﺗﺮﻛﺖ ﻟﻪ ﺧﻴﺎر ﺑﺄن ﻻ
ﻳﻘﻮم ﺑﺎﻹدﺧﺎل أ ﻳﻀﺎ .ﻣﺜﻼ:
*\w
§ \+
ﻟﻮ أردت أن ﻳﻘﻮم اﻟﻤﺴـ ــــــ ـﺘﺨـﺪم ﺑـﺈدﺧـﺎل ﺧـﺎﻧـﺎت ﻛﺜﻴﺮة أو ﻋﻠﻰ اﻷﻗـﻞ ﻻﺑـﺪ ﻣﻦ إدﺧـﺎل ﺧـﺎﻧـﺔ
ﺨﺎـﻧﺎت ﻛﺜﻴﺮة أو ﻋﻠﻰ اﻷـﻗﻞ
ﻤﻞء اﻟﻔﺮاغ ﺑ ـ
ﺠﺎل ﻟﺘﺮـﻛﻪ ـﻓﺎﺿـ ــــــ ـﻲ إـﻣﺎ إن ﺗﻘﻮم ﺑ ـ
ﺣﺪة ﺑﻤﻌﻨﻰ ﻻ ﻣ ـ
وا ـ
أدﺧﻞ ﺧﺎﻧﺔ .ﻣﺜﻼ:
\w+
ﻳﺪع اﻟﻤﺠﺎل ﻟﻠﻤﺴﺘﺨﺪم إﻣﺎ أن ﻻ ﻳﺪﺧﻞ أﺑﺪا أو ﻳﺪﺧﻞ ﺧﺎﻧﺔ واﺣﺪة ﻓﻘﻂ ،ﻣﺜﻼ:
?\w
§ )(
)"}("\\d{4
§ |
ﻟﻨﻔﺮض أﻧﻚ ﻃﻠﺒﺖ ﻣﻦ اﻟﻤﺴـ ــ ـﺘﺨﺪم إدﺧﺎل ﺑﻴﺎن ﻣﻌﻴﻦ وﻳﺤﺘﻤﻞ إدﺧﺎﻟﻪ أ ﻛﺜﺮ ﻣﻦ ﺷـ ــ ـﻜﻞ
)ﺗﻨﺴـ ــــــ ـﻴﻖ( ﻓﻨﺴـ ــــــ ـﺘﺨـﺪم ﻫـﺬه اﻟﻌﻼﻣـﺔ ﻟﻠﺘﺨﻴﻴﺮ ﺑﻤﻌﻨﻰ ﻟﻮ أدﺧـﻞ اﻟﺘﻨﺴـ ــــــ ـﻴﻖ اﻟـﺬي ﻋﺮﻓﻨـﺎه أو
اﻟﺘﻨﺴﻴﻖ اﻷﺧﺮ ﻓﻬﻮ ﺻﺤﻴﺢ ،ﻣﺜﻼ:
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
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
Hello , please complete this form :
Enter your name :
Find v
ﺗﺘﺤﻘﻖ ﻫﺬه اﻟﺪاﻟﺔ ﻣﻦ ﺗﻄﺎﺑﻖ اﻟﻨﺺ اﻟﻤﺪﺧﻞ ﻣﻊ اﻟﺘﻨﺴـ ـــــ ـﻴﻖ اﻟﻤﺨﺼـ ـــــ ـﺺ ﻟﻪ ﻃﺎﻟﻤﺎ ﻛﺎن
.null وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑـ،ﻣﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑﺎﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ
§ ﻣﺜﺎل
println("enter your phone number:")
var phone = readLine()!!.toString()
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
findAll v
{ )for (i in matchedResults
)" " print(i.value +
}
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
اﻟﺘﻨﺴـ ـــ ـﻴﻖ اﻟﻤﻄﻠﻮب ﻓﻲ اﻟﻤﺜﺎل ﻫﻮ رﻗﻢ ﻓﻘﻂ ﻓﻨﻘﻮم ﺑﻌﻤﻞ ﺣﻠﻘﺔ ﺗﻌﻮد ﺑﺎﻷرﻗﺎم اﻟﻤﻮﺟﻮدة
ﻓﻲ اﻟﻨﺺ ﻣﻊ ﻃﺒﺎﻋﺔ ﻣﺴﺎﻓﺔ:
ﻧﻼﺣﻆ أﻧﻪ ﻃﺒﻊ رﻗﻢ ١وﻣﻦ ﺛﻢ ﻣﺴـ ـــﺎﻓﺔ وﻣﻦ ﺛﻢ ﻃﺒﻊ اﻷرﻗﺎم ٢٣٢ﻣﺘﺘﺎﻟﻴﺔ ﺑﺪون ﻣﺴـ ـــﺎﺣﺔ
ﻷﻧﻬﺎ ﻓﻲ اﻟﻨﺺ أﺗﺖ ﻣﻊ ﺑﻌﻀـ ـــ ـﻬﺎ ﻟﻢ ﻳﻔﺼـ ـــ ـﻠﻬﺎ ﺣﺮف أو رﻣﺰ وﻣﻦ ﺛﻢ ﻣﺴـ ـــ ـﺎﺣﺔ وﻫﻜﺬا ﻳﺴـ ـــ ـﺘﻤﺮ
ﻋﻤﻠﻬﺎ.
matchEntire v
ﻟﻠﺘﺤﻘﻖ ﻣﻦ اﻟﻘﻴﻤـﺔ اﻟﻤـﺪﺧﻠـﺔ ﻋﻨـﺪ اﻟﺘﻄـﺎﺑﻖ ﻣﻊ اﻟﺘﻨﺴـ ــــــ ـﻴﻖ اﻟﻤﺨﺼـ ــــــ ـﺺ ﻟـﻪ ﻃـﺎﻟﻤـﺎ ﻛـﺎن
ﻣﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑﺎﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ ،وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑ ـ ـــــــ ـ ،nullﻣﻊ اﻟﺘﻨﻮﻳﻪ أن اﻟﻤﺴـﺎﻓﺔ
ﺗﺤﺘﺴﺐ ﻛﺤﺮف ﻓﻌﻨﺪ إٍذ ﺗﻌﻮد ﺑـ nullﻟﻮ ﻛﺎن اﻟﺘﻨﺴﻴﻖ اﻟﻤﻄﻠﻮب رﻗﻢ ﻓﻘﻂ.
)println(age
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
matches v
ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﺗﻄـﺎﺑﻖ اﻟﻘﻴﻤـﺔ اﻟﻤـﺪﺧﻠـﺔ ﻛـﺎﻣﻠـﺔ ﻣﻊ اﻟﺘﻨﺴـ ــــــ ـﻴﻖ اﻟﻤﺨﺼـ ــــــ ـﺺ ﻟـﻪ ﻃـﺎﻟﻤـﺎ ﻛـﺎن
ﻣﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑـ ، trueوﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑـ .false
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
false
containsMatchIn v
إذا ﻛﺎن ﺟﺰء ﻣﻦ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ ﻣﺘﻄﺎﺑﻘﺔ ﻣﻊ اﻟﺘﻨﺴ ـﻴﻖ اﻟﻤﺨﺼ ـﺺ ﻟﻪ ﻳﻌﻮد ﺑ ـ ــــــــ ـ ،true
وﻋﻨﺪ ﻋﺪم اﻟﺘﻄﺎﺑﻖ ﻳﻌﻮد ﺑ ـ ــــــــــ ـ ،falseوﻫﻲ ﻋﻜﺲ اﻟﺪاﻟﺔ matchEntireاﻟﺘﻲ ﺗﻌﺪ أن اﻟﻘﻴﻤﺔ
ﻏﻴﺮ ﻣﺘﻄﺎﺑﻘﺔ.
§ ﻣﺜﺎل
)"var age =Regex("""\d+""").containsMatchIn("25 years
)println(age
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
true
ﻧﻼﺣﻆ أﻧﻪ ﻋﺎد ﺑـ trueوذﻟﻚ ﻷن اﻟﻮﻇﻴﻔﺔ اﻟﺮﺋﻴﺴﻴﺔ ﻟﻴﺴﺖ ﺗﻄﺎﺑﻖ ﺟﻤﻴﻊ اﻟﻘﻴﻤﺔ اﻟﻤﺪﺧﻠﺔ
إﻧﻤﺎ ﻳﺘﺤﻘﻖ ﻫﻞ أدﺧﻠﺖ رﻗﻢ ﻛﻤﺎ ﻫﻮ ﻣﻄﻠﻮب ﻓﻲ اﻟﺘﻨﺴﻴﻖ.
اﻟﻘﻴﻤﺔ اﻟﻌﺎﺋﺪة :ﺗﻌﻴﺪ ﻟﻨﺎ ﻗﺎﺋﻤﺔ ﺗﺨﻠﻮ ﻣﻦ اﻟﺘﻨﺴﻴﻖ اﻟﺬي أﻧﺖ ﺣﺪدﺗﻪ .ﻣﺜﺎل:
ﻃﻠﺒﻨـﺎ ﻣﻨـﻪ أن ﻳﻌﻮد ﺑﺠﻤﻴﻊ ﻣـﺎ ﺗﻘﻮم ﺑـﺈدﺧـﺎﻟـﻪ ﺑـﺎﺳـ ــــــ ـﺘﺜﻨـﺎء )”] Regex(“[a-zA-Zﺟﻤﻴﻊ
اﻟﺤﺮوف ﻻ ﺗﻌﻮد.
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
enter your age:
28
][28
replace v
إذا ﺗﻘﻮم ﺑﺎﺳﺘﺒﺪال ﻗﻴﻤﺔ ﻣﻌﻴﻨﺔ ﻓﻲ اﻟﻨﺺ ﺑﻘﻴﻤﺔ أﺧﺮى ﻋﻦ ﻃﺮ ﻳﻖ ﺗﺤﺪﻳﺪﻫﺎ ﻓﻲ اﻟﺘﻨﺴﻴﻖ.
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
abxcdxef
For Loop
ﻓﻠﻨﻔﺘﺮض أﻧﻨـﺎ أردﻧـﺎ ﻛﺘـﺎﺑـﺔ ﺟﻤﻴﻊ اﻷرﻗـﺎم اﻟﻮاﻗﻌـﺔ ﻣﻦ ١٠-١ﻓﻲ ﺑﺮﻧـﺎﻣﺠﻨـﺎ ،ﻫـﻞ ﻫـﺬا ﻣﻤﻜﻦ؟
ﻧﻌﻢ ،ﻣﻤﻜﻦ ﺣﺴـ ــــــ ـﻨـﺎ ً وﻟﻮ اردﻧـﺎ ﻛﺘـﺎﺑـﺔ اﻷرﻗـﺎم ﻣﻦ ،٢٠ -١ﻫـﻞ ﻫـﺬا ﻣﻤﻜﻦ؟ ﺳـ ــــــ ـﻮف ﻧﻘﻮل ﻧﻌﻢ
وﻟﻜﻦ ﻟﻨﻔﻜﺮ ﻗﻠﻴﻼ ً ﺑﺄرﻗﺎم ا ﻛﺒﺮ ﻣﺜﻼ ً ﻣﻦ ١٠٠ – ١ﺳـ ــــ ـﻮف ﺗﺠﺎوب وﺑﺴـ ــــ ـﺮﻋﺔ إﻧﻪ أﻣﺮ ﻣﺮﻫﻖ أن
ا ﻛﺘﺐ ﻛﻞ اﻷﻋﺪاد ﺑﺪاﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ ،ﺣﺴـ ـــــ ـﻨﺎ ً ﻣﺜﺎل أﺧﺮ ﻟﻮ وﺿـ ـــــ ـﻌﺖ ﺷـ ـــــ ـﺮط أردﻧﺎ ﺗﻜﺮار ﻇﻬﻮر
رﺳـ ــ ـﺎﻟﺔ ﻣﻌﻴﻨﺔ ﻣﺎدام ﻫﺬا اﻟﺸـ ــ ـﺮط ﺻـ ــ ـﺤﻴﺢ ،ﻫﻨﺎ ﺗﻈﻬﺮ ﻓﺎﺋﺪة ﺣﻠﻘﺎت اﻟﺘﻜﺮار اﻟﺘﻲ ﺗﻘﻮم ﺑﺘﻜﺮار
ﻤﺎ ﻓﻲ ﻣـﺜﺎل اﻷرـﻗﺎم اـﻟﺬي ذﻛﺮـﻧﺎه أردـﻧﺎ ﻃـﺒﺎ ـ
ﻋﺔ ﻌﺖ ـﻟﻪ ﺷـ ــــــ ـﺮط أو ﻛ ـ اﻷﻣﺮ اﻟﺒﺮﻣﺠﻲ ﻓﻲ ـ
ﺣﺎل وﺿـ ــــــ ـ ـ
ﻣﺠﻤﻮﻋﺔ اﻷرﻗﺎم.
اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ:
ﻫﻨ ـﺎ أردﻧ ـﺎ ﻃﺒ ـﺎﻋ ـﺔ اﻷﻋ ـﺪاد ﻣﻦ ١٠-١أي أن اﻟﻨﻄ ـﺎق ﻋﻨ ـﺪي ﻣﻌﻠﻮم ﻓﻘﻂ ١٠ارﻗ ـﺎم ار ﻳ ـﺪ
ﻃﺒـﺎﻋﺘﻬـﺎ ﻣﻊ ﻣﺮاﻋـﺎة ان اﻟﻨﻘﻄﺘﻴﻦ ﺑﻴﻦ اﻟﻌـﺪدﻳﻦ ﻣﻬﻤﻴﻦ ﻷﻧﻨـﺎ ﻧﺮ ﻳـﺪ اﻷﻋـﺪاد اﻟﺘﻲ ﺗﻘﻊ ﻓﻲ ﻫـﺬا
اﻟﻨﻄﺎق.
)for ( i in 1..10
{
)println(i
}
وﻧﺴـﺘﻄﻴﻊ ﺗﻄﺒﻴﻖ ﻣﺎ ﺗﻌﻠﻤﻨﺎه ﻓﻲ درس اﻟﺴـﻼﺳـﻞ اﻟﻨﺼـﻴﺔ وﻫﻮ اﺳـﺘﺨﺪام اﻟﺪوال اﻟﺨﺎﺻـﺔ
ﺑﻬﺎ.
ﻣﺜﻼ ﻟﻮ أردﻧﺎ ﻃﺒﺎﻋﺔ ﺟﺪول اﻟﻀ ـﺮب ﻣﻦ ٥-١ﺟﺪول ١وﺟﺪول ٢وﺟﺪول ٣وﻫﻜﺬا وﺻ ـﻮﻻ ً
ﻟ ـ ــــــــ ـ ، ٥وﻟﻜﻨﻨﺎ ﻻ ﻧﺮ ﻳﺪ ﻃﺒﺎﻋﺔ ﺟﺪول اﻟﻀ ـﺮب ﻛﺎﻣﻼ ﻣﻦ ١٠-١ﺳ ـﻮف ﻧﻜﺘﻔﻲ ﻣﻦ ، ٣-١ﺳ ـﻮف
ﻧﺴﺘﺨﺪم ﺣﻠﻘﺘﻴﻦ ﻣﺘﺪاﺧﻠﺘﻴﻦ ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل.
ﻗﻴﻤﺔ اﻟﻤﺘﻐﻴﺮ iﻓﻲ اﻟﺤﻠﻘﺔ اﻷوﻟﻰ ﺗﻌﺒﺮ ﻋﻦ ﻋﺪد ﺟﺪاول اﻟﻀـ ـــ ـﺮب اﻟﺬي ﻧﺮ ﻳﺪﻫﺎ ﻓﻨﺤﻦ ﻧﺮ ﻳﺪ
ﻣﻦ ﺟـﺪول ١إﻟﻰ ﺟـﺪول ، ٥وﻣﻦ ﺛﻢ ﻗﻤﻨـﺎ ﺑﻔﺘﺢ اﻷﻗﻮاس اﻟﻤﺮ ﺑﻌـﺔ وﻛﺘﺒـﺎن ﺑـﺪاﺧﻠﻬـﺎ اﻟﺤﻠﻘـﺔ
اﻟﺜـﺎﻧﻴـﺔ وﻫﻲ ﻣـﺎ ﺗﻌﺮف ﺑـﺎﻟﻤﺘـﺪاﺧﻠـﺔ ﻷﻧﻬـﺎ دﺧﻠـﺖ ﻋﻠﻰ اﻷوﻟﻰ ،ﻗﻴﻤـﺔ اﻟﻤﺘﻐﻴﺮ xﺗﻌﺒﺮ ﻋﻦ أﻧﻨـﺎ
ﻧﺮ ﻳﺪ ﺑﺪء اﻟﻀﺮب ﻣﻦ رﻗﻢ ١واﻟﺘﻮﻗﻒ ﻋﻨﺪ ٣ﻻ ﻧﺮ ﻳﺪ ﻃﺒﺎﻋﺔ اﻟﺠﺪول ﻛﺎﻣﻞ.
{)for(i in 1..5
{ )for(x in 1..3
)println("$i * $x = " +i*x
}
)"println("--------------
}
number is even
21
number is odd
10
number is even
اﻟﺠﻤﻠﺔ while
ﻳﺆدي اﻷﻣﺮ whileاﻟﻰ ﺗﻨﻔﻴﺬ اﻟﺸـ ـــــ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ ﻣﺮارا ً وﺗﻜﺮاًر ﻃﺎﻟﻤﺎ ان اﻟﺸـ ـــــ ـﺮط ﻣﺘﺤﻘﻖ
ﺑـTrue
)while( condition
{
statements
.
.
counter
}
ﻫﻨﺎ اﻓﺘﺮﺿـﻨﺎ ان اﻟﻤﺘﻐﻴﺮ ﻗﻴﻤﺘﻪ ٢وﻣﻦ ﺛﻢ ﻗﻠﻨﺎ ﻃﺎﻟﻤﺎ أن iاﻗﻞ ﻣﻦ ١٠ﻗﻢ ﺑﻄﺒﺎﻋﺔ ﻗﻴﻤﺔ ،
ﺣﺴﻨﺎ وﻟﻜﻦ ﻣﺎذا ﺗﻌﻨﻲ i++ﻫﺬا ﻳﻌﻨﻲ أﻧﻨﺎ ﻧﺮ ﻳﺪ ز ﻳﺎدة اﻟﻌﺪد وﻣﻦ ﺛﻢ ﻧﺨﺘﺒﺮه ﻣﺮة أﺧﺮى ﺣﺘﻰ
ﻳﺼـ ـــ ـﻞ إﻟﻰ ٩ﻳﻘﻮم ﺑﻄﺒﺎﻋﺘﻪ وﻣﻦ ﺛﻢ ﻳﺘﻮﻗﻒ اﻟﺒﺮﻧﺎﻣﺞ ﻟﻤﺎذا؟ ﻷن اﻟﺸـ ـــ ـﺮط ﻳﺮ ﻳﺪ ﻃﺒﺎﻋﺔ اﻻﻋﺪاد
اﻟﺘﻲ ﺗﻘﻞ ﻋﻦ ١٠ﻓﻌﻨﺪﻣﺎ ﻧﺼـﻞ ﻟﻠﻌﺸـﺮة ﻟﻦ ﻳﺘﺤﻘﻖ اﻟﺸـﺮط أي ﻳﺼـﺒﺢ ﻏﻴﺮ ﺻـﺤﻴﺢ وﻣﻦ ﺛﻢ
ﻳﺘﻮﻗﻒ ،ﻟﻮ اﻧﻨﺎ ﻗﻠﻨﺎ اﻟﺸـ ـﺮط ﻫﻜﺬا i<=10ﻫﻨﺎ ﺳـ ـﻮف ﻳﺘﺤﻘﻖ ﻣﻦ ﻗﻴﻤﺔ ١٠وﻣﻦ ﺛﻢ ﻳﺘﻮﻗﻒ
وذﻟﻚ ﻷن ﻋﻼﻣﺔ اﻟﻤﺴﺎواة ﻣﺘﻮاﺟﺪة أي ﻫﻞ اﻟﺮﻗﻢ اﻗﻞ
ﻣﻦ ١٠او ﻳﺴﺎوﻳﻬﺎ اذا ﻛﺎن ﻧﻌﻢ ﻓﺎﻟﺸﺮط ﺻﺤﻴﺢ وإذا اﻟﻌﻜﺲ ﻓﺘﻮﻗﻒ.
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
ﻫﻨـﺎ ﻓﻲ اﻟﺒـﺪا ﻳـﺔ ﻋﺮﻓﻨـﺎ اﻟﻤﺘﻐﻴﺮ 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
when
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"
اذا ﻛﺎن ﻟﺪﻳﻚ ا ﻛﺜﺮ ﻣﻦ ﺣﺎﻟﺔ وﺗﻮد اﺧﺘﺒﺎرﻫﺎ ﻓﻲ whenواﺣﺪة ﺳﻴﺘﺤﺘﻢ ﻋﻠﻴﻚ وﺿﻊ ﻓﺎﺻﻠﺔ
ﺑﻴﻦ ﻛﻞ اﺣﺘﻤﺎل وآﺧﺮ ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ.
is : اﺳﺘﺨﺪاﻣﻬﺎ ﻛـv
. ﺑﺎﻟﺸﻜﻞ اﻟﺘﺎﻟﻲwhen ﻣﻊis اذا اردت اﻟﺘﺤﻘﻖ ﻣﻦ ﻧﻮع اﻟﻤﺘﻐﻴﺮ ﻳﻤﻜﻨﻚ اﺳﺘﺨﺪام
ﺳﺘﻜﻮن اﻓﻀﻞ وارﺗﺐ ﻟﻠﻜﻮد وأ ﻛﺜﺮ ﻣﻨﻄﻘﻴﺔ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ﻫﻲ ) .( if ..else – when
اﻟﺠﻤﻠﺔ if
اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ:
{ )if (testExpression
}
}
اذا ﺗﺤﻘﻖ اﻟﺸ ـﺮط ﻧﻔﺬ ﻣﺎﺑﺪاﺧﻞ ifاذا ﻟﻢ ﻳﺘﺤﻘﻖ ﺗﺠﺎوز ﺑﺪون ان ﻳﻜﻮن ﻫﻨﺎك اي اﺣﺘﻤﺎل
آﺧﺮ.
if ..else
ر ﺑﻤﺎ ﻳﻜﻮن ﻟﺪﻳﻨﺎ اﺣﺘﻤﺎﻟﻴﻦ ﻟﻞ ifﻛﻤﺎ ﺳـ ــــــ ـﻨﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل اﻟﻘﺎدم وﻟﺬﻟﻚ ﺳـ ــــــ ـﻨﺤﺘﺎج اﻟﻰ
اﺳ ـﺘﺨﺪام elseﻃﺮ ﻳﻘﺔ ﻛﺘﺎﺑﺔ ﺷ ـﺮط ﺑﺴ ـﻴﻂ ﻋﺒﺎرة اﻟﺸ ـﺮط وإذا ﻟﻢ ﻳﺘﺤﻘﻖ ﻓﺴ ـﻮف ﻳﺘﻨﻔﺬ أﻣﺮ
أﺧﺮ ،
§ ﻣﺜﺎل
ﻫﻨﺎ ﺳـ ــ ـﻮف ﻳﻄﻠﺐ ﻣﻦ اﻟﻤﺴـ ــ ـﺘﺨﺪم إدﺧﺎل اﺳـ ــ ـﻢ ﺣﺴـ ــ ـﻨﺎ ً و وﻣﻦ ﺛﻢ ﻳﻘﻮم ﺑﻤﻘﺎرﻧﺔ اﻻﺳـ ــ ـﻢ
اﻟﻤﺪﺧﻞ ﻫﻞ ﻫﻮ أﺣﻤﺪ؟
)"if(Name == "Ahmed
)"println("Welcome $Name
else
)"println("Error
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
Welcome Ahmed
§ ﻣﺜﺎل
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
Please enter your mark :
78
78.0 Good
اﻟﻤﺘﺪاﺧﻠﺔIf
:اﻟﺼﻴﻐﺔ اﻟﻌﺎﻣﺔ
if( boolean_expression 1) {
ﺗﺤﻘﻖ اﻟﺸـ ـــ ـﺮط ﺳـ ـــ ـﻴﺪﺧﻞ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 ﻣﻦ اﻻﺷ ـﻴﺎء اﻟﺠﻤﻴﻠﺔ ﻓﻲ
.ﻣﺒﺎﺷﺮة واﻋﺎدة ﻗﻴﻤﺔ ﻟﻠﻤﺘﻐﻴﺮ اﻟﻤﻌﺮف
§ ﻣﺜﺎل
val a = 100
val b = 200
ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ ﻳﻦ واﺳـﻨﺪﻧﺎ ﻟﻬﻢ ﻗﻴﻢ وﻓﻲ اﻟﻤﺘﻐﻴﺮ اﻟﺜﺎﻟﺚ ﻋﺮﻓﻨﺎ maxﺳـﻴﺤﺼـﻞ ﻋﻠﻰ اﻟﻘﻴﻤﺔ
اﻻﻋﻠﻰ ﺑﻴﻦ .a & b
اﻟﺪ و ال
اﻟﺪوال اﺷـ ــــ ـﻬﺮ ﻣﻦ ﻧﺎر ﻋﻠﻰ ﻋﻠﻢ ﻓﻲ ﻋﺎﻟﻢ اﻟﺒﺮﻣﺠﺔ ﺟﻤﻴﻌﻨﺎ ﻧﻌﻠﻢ أﻫﻤﻴﺔ اﺳـ ــــ ـﺘﺨﺪاﻣﻬﺎ واﻧﻬﺎ
ﺗﺨﺘﺼﺮ اﻟﻮﻗﺖ ﻋﻠﻴﻨﺎ ﻓﻲ ﺗﻜﺮار اﻟﻌﻤﻠﻴﺎت وﺗﻮﻓﺮ اﻟﺠﻬﺪ.
ﺗﻌﺮ ﻳﻔﻬﺎ ﺟﺪا ﺑﺴـﻴﻂ ﻧﺴـﻤﻲ اﻟﺪاﻟﺔ وﻳﻔﻀـﻞ ﺗﺴـﻤﻴﺘﻬﺎ ﻛﻤﺎ ﻧﻌﻠﻢ ﺟﻤﻴﻌﺎ ﺑﺎﺳـﻢ ﻳﻤﺜﻠﻬﺎ أي
ﻳﻤﺜﻞ اﻟﻐﺮض اﻟﺬي ﻣﻦ اﺟﻠﻪ اﻧﺸـ ـــ ـﺄﺗﻬﺎ :Unit ،ﻫﺬا ﻳﻌﻨﻲ ﻧﻮع اﻟﺒﻴﺎﻧﺎت اﻟﻌﺎﺋﺪة وﻫﻨﺎ ﻳﻘﺼـ ـــ ـﺪ
أﻧﻬﺎ ﻻ ﺗﻌﻮد ﺑﺸـﻲء وﻣﻦ اﻟﻤﻤﻜﻦ أن ﻻ ﻧﻜﺘﺒﻬﺎ وﻫﻮ ﺳـﻴﻌﺮف اﻧﻬﺎ داﻟﺔ ﻻ ﺗﻌﻴﺪ ﻗﻴﻤﺔ ،وﻣﻦ ﺛﻢ
ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻷواﻣﺮ اﻟﺘﻲ ار ﻳﺪﻫﺎ ﺑﺪاﺧﻞ اﻻﻗﻮاس.
fun circleCirc(radius:Float):Unit
{
val bai=3.14
var circumference = bai *2 * radius
println("the circumference of circle is :" +circumference)
}
{)(fun welcome
)"return println("welcome world
}
ﺛﺎﻟﺜﺎ ً :اﻻﺳﺘﺪﻋﺎء
ﺣﺴـ ــــــ ـﻨﺎ ً ﻧﺤﻦ ﻋﺮﻓﻨﺎ اﻵن اﻟﺪوال وﻃﺮ ﻳﻘﺔ ﻛﺘﺎﺑﺘﻬﺎ ،ﺗﺒﻘﻰ ﻋﻠﻴﻨﺎ ﻣﻌﺮﻓﺔ ﻃﺮ ﻳﻘﺔ اﺳـ ــــــ ـﺘﺪﻋﺎﺋﻬﺎ
وﻫﻲ ﺟﺪا ً ﺑﺴﻴﻄﺔ ﻛﺎﻟﺘﺎﻟﻲ:
ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﺳﻢ اﻟﺪاﻟﺔ وان ﻛﺎﻧﺖ ﺗﻤﺮر ﻟﻬﺎ ﻗﻴﻢ ﻓﻼ ﻧﻨﺴﻰ ﻛﺘﺎﺑﺔ ﻫﺬه اﻟﻘﻴﻢ.
fun circumference(a:Int):Int{
return a*4
}
fun main(args:Array<String>){
Extension function
ﺿﺢ
ﺳﺒﻖ وﺗﻌﺮﻓﻨﺎ وﻟﻜﻦ ﻛﻴﻒ ﺗﻜﻮن اﻣﺘﺪاد او extension؟ او ﻟﻨﻮ ـ
ﺗﻌﺘﺒﺮ داﻟﺔ ﻋﺎدﻳﺔ ﻛﻤﺎ ـ
اﻟﺴﺆال أ ﻛﺜﺮ ﻣﺎ ﻓﺎﺋﺪﺗﻬﺎ ؟
ﻣﺎذا ﻟﻮ اردﻧﺎ اﺿـﺎﻓﺔ داﻟﺔ ﻏﻴﺮ ﻣﻮﺟﻮدة ﻣﺴـﺒﻘﺎ ً ﻓﻲ class stringﻣﺜﻼ ً ؟ ﺣﺘﻤﺎ ً ﺳـﺘﺤﺘﺎج اﻟﻰ
extensionوﺳﺎوﺿﺤﻬﺎ ﻫﻨﺎ ﻓﻲ ﻣﺜﺎﻟﻴﻦ:
ﺣﺴ ـﻨﺎ ﻧﺴ ـﺘﻄﻴﻊ ﺑﻨﺎء داﻟﺔ ﺗﻜﻮن اﻣﺘﺪاد ﻟﻄﺒﻘﺔ ﻣﺎ classدون اﻟﺘﻌﺮ ﻳﻒ ﻋﻨﻬﺎ ،ﻣﺜﺎل ﻋﻠﻰ
ذﻟﻚ:
ﻟﻨﻔﺮض اﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺎﻧﺸﺎء classﻟ ـ ـــــ ـ carوﻛﺎن ﻳﺤﺘﻮي ﻋﻠﻰ funcواﺣﺔ ﻓﻘﻂ وﻫﻲ ﻟﺤﺴﺎب
اﻟﺴﺮﻋﺔ اذا ﻛﺎﻧﺖ ﻣﻨﺨﻔﻀﺔ.
{class Car
{fun LowSpeed(sp:Int):Boolean
return sp <100
}
}
اﻻن ﺑﻌﺪ ﻓﺘﺮة ﻣﻦ اﻟﻮﻗﺖ اﺣﺘﺠﺖ ان اﻗﻮم ﺑﺎﺿ ـﺎﻓﺔ داﻟﺔ ﺟﺪﻳﺪة ل class carوﻟﻜﻦ ﻻ ار ﻳﺪ
اﻟﺘﻌﺪﻳﻞ ﻋﻠﻴﻪ ؟ ﺳﺎﻗﻮم ﺑﺎﺳﺘﺨﺪام extensionﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﺘﺎﻟﻴﺔ:
{fun Car.highSpeed(sp:Int):Boolean
return sp >100
}
ﻧﻼﺣﻆ أﻧﻬﺎ داﻟﺔ ﻋﺎدﻳﺔ وﻟﻜﻦ ﻟﺘﻜﻮن اﻣﺘﺪاد ﻟﻄﺒﻘﺔ ﻣﺎ ﻧﻘﻮم ﺑﻮﺿـ ــ ـﻊ اﺳـ ــ ـﻢ اﻟﻄﺒﻘﺔ وﻣﻦ ﺛﻢ
اﺳﻢ اﻟﺪاﻟﺔ ﻛﻤﺎ ﻫﻮ ﻣﻼﺣﻆ ﻟﺪﻳﻨﺎCar.highSpeed
{)>fun main(args:Array<String
}
vاﻟﻤﺜﺎل اﻟﺜﺎﻧﻲ
lambda function
اﻓﻀ ـﻞ ان اﺳ ـﻤﻴﻬﺎ اﻟﺪاﻟﺔ اﻟﻤﻀ ـﻤﻨﺔ وذﻟﻚ ﻷن ﻣﻦ اﻟﻮﻫﻠﺔ اﻷوﻟﻰ ﻋﻨﺪ اﻟﻨﻈﺮ إﻟﻴﻬﺎ ﺗﺴ ـﺘﻨﻜﺮ
أﻧﻬـﺎ داﻟـﺔ ﻓﻨﺤﻦ ﻛﻤـﺎ ﺗﻌﻠﻤﻨـﺎ أﻧﻨـﺎ ﻧﻘﻮم ﺑـﺄﻧﺸـ ـــــــ ـﺎء ﻣﺘﻐﻴﺮ وﻓﺘﺢ ﻗﻮﺳـ ــــــ ـﻴﻦ وﻣﻦ اﻟﻤﻤﻜﻦ ﺗﻤﺮ ﻳﺮ
ﻣﺘﻐﻴﺮات ﻟﻬـﺬا اﻟﻘﻮﺳـ ــــــ ـﻴﻦ اﻟـﺪاﺋﺮ ﻳﻴﻦ وﻣﻦ ﺛﻢ اﻷﻗﻮاس اﻟﻤﺮ ﺑﻌـﺔ وﺑـﺪاﺧﻠﻬـﺎ اﻟﺠﻤـﻞ اﻟﺒﺮﻣﺠﻴـﺔ
{ = val printMessage
)"!println("Hello, world
}
)(printMessage
// or
)(printMessage.invoke
اﻣﺎ اذا اردﻧﺎ ﺗﻤﺮ ﻳﺮ ﻣﺘﻐﻴﺮات اﻟﻰ اﻟﺪاﻟﺔ ﻓﺎﻧﻨﺎ ﺳـﻨﺴـﺘﺨﺪم اﻟﺸـﻔﺮة اﻟﻘﺎدﻣﺔ وﺳـﻴﺘﻢ ﺗﻀـﻤﻴﻦ
اﻟﻤﺘﻐﻴﺮات داﺧﻠﻬﺎ ﻛﻤﺎ ﺳﺘﻼﺣﻆ
ﻧﻘﻮم ﺑﻔﺘﺢ أﻗﻮاس ﻣﺮ ﺑﻌـﺔ وﺑـﺪاﺧﻠﻬـﺎ ﻧﻌﺮف اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﺳـ ــــــ ـﻴﺘﻢ ﺗﻤﺮ ﻳﺮﻫـﺎ وﻣﻦ ﺛﻢ
اﻟﺴﻬﻢ وﻳﻠﻴﻪ ﺟﺴﻢ اﻟﺪاﻟﺔ وﻫﻲ اﻷواﻣﺮ اﻟﻤﺮاد ﺗﻨﻔﻴﺬﻫﺎ.
§ ﻣﺜﺎل
}val total : (Int , Int)->Int = {num1 , num2 -> num1+num2
}
§ ﻟﻜﻲ ﻧﺴﺘﻄﻴﻊ اﻟﻘﻮل أﻧﻬﺎ داﻟﺔ ﻋﺎﻟﻴﺔ اﻟﻤﺴﺘﻮى ﻻﺑﺪ ﻣﻦ ﺗﻮﻓﺮ اﻻﺗﻲ
• ﺗﻤﺮر ﻟﻬﺎ داﻟﺔ ﻛﻮﺳﻴﻂ.
• ﺗﻌﻴﺪ داﻟﺔ.
• ﻧﺴﺘﻄﻴﻊ ﻓﻌﻞ اﻟﺨﻄﻮﺗﻴﻦ اﻟﺴﺎﺑﻘﺘﻴﻦ أ ﻳﻀﺎ ﻣﻌﺎ ً.
ﻤﻞ ﻋﻠﻰ
ﻋﺎﻟـﻴﺔ اﻟﻤﺴـ ــــــ ـﺘﻮى ﻓﻬﺲ ﺗﻌ ـ
ﺨﺪام lambdaارﺗـﺒﺎط وﺛﻴﻖ ـﺑﺎـﻟﺪاـﻟﺔ ـ
وﻳﺮﺗﺒﻂ اﺳـ ــــــ ـﺘ ـ
ﺗﺮﺗﻴﺐ اﻟﺠﻤﻞ اﻟﺒﺮﻣﺠﻴﺔ وﺟﻌﻠﻪ اﺳـ ــ ـﻬﻞ ﻛﻤﺎ ﻻ ﻳﺨﻔﻰ ﻋﻠﻴﻨﺎ ﺗﻘﻠﻞ ﻣﻦ اﻷﺳـ ــ ـﻄﺮ اﻟﺒﺮﻣﺠﻴﺔ ﻣﻤﺎ
ﻳﻌﻄﻴﻨﺎ ﺷﻜﻞ ﺑﺴﻴﻂ وﻧﻈﻴﻒ.
– ﻣﺘﻐﻴﺮ ﻣﻦ ﻧﻮع ﻋﺪد ﺻﺤﻴﺢ وﻧﺮ ﻳﺪ ان ﻧﻄﺒﻊ اﻟﻌﺪد اﻟﺬي ﻳﺴﺒﻘﻪ واﻟﻌﺪد اﻟﺘﺎﻟﻲ ﻟﻪ.
– اﻟﻤﺘﻐﻴﺮ اﻟﺜﺎﻧﻲ :داﻟﺔ ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ اﻟﻌﺪد اﻟﻤﺪﺧﻞ )ﻣﻊ اﻟﻌﻠﻢ ﻧﺴـ ـﺘﻄﻴﻊ أن ﻧﻨﺸـ ـﺊ داﻟﺔ
ﻻ ﻋﻼﻗﺔ ﻟﻬﺎ ﺑﺎﻟﻤﺘﻐﻴﺮ اﻟﺴﺎﺑﻖ ﻛﺄن ﺗﻘﻮم ﺑﺈﻧﺸﺎء داﻟﺔ ﺗﻠﻘﻲ اﻟﺘﺤﻴﺔ ﻣﺜﻼ ً(.
}
vاﻟﺨﻄﻮة اﻟﺜﺎﻧﻴﺔ
ﺣﺴـﻨﺎ ً ﺳـﻨﺘﺤﺪث ﻋﻦ ﻫﺬا اﻷن ﻗﻠﻴﻼ ً ،ﻫﺬه ﻫﻴﺎ اﻟﺼـﻴﻐﺔ اﻟﺘﻲ ﺗﻌﻠﻤﻨﻬﺎ ﻛﻤﺎ ﺳـﺒﻖ ﻟﻨﺎ وﻟﻜﻦ
ﻧﺮ ﻳﺪ أن ﻧﻮﺿـ ـــ ـﺢ أن أﻫﻤﻴﺘﻬﺎ ﺗﻜﻤﻦ ﻓﻲ أﻧﻨﺎ ﻛﻤﺎ ﺳـ ـــ ـﻨﺮى ﻓﻲ اﻟﺨﻄﻮة اﻟﺜﺎﻟﺜﺔ ﺑﻌﺪ ﻗﻠﻴﻞ أﻧﻬﺎ ﺗﻮﻓﺮ
ﻋﻠﻴﻨﺎ اﻟﻮﻗﺖ ﺑﺪل ﻣﻦ أن ﻧﻨﺸﺊ داﻟﺔ ﺟﺪﻳﺪة أﺧﺮى ﻋﻨﺪ اﻻﺳﺘﺪﻋﺎء وﺳﻮف ﻧﺮى ذﻟﻚ.
vاﻟﺨﻄﻮة اﻟﺜﺎﻟﺜﺔ
ﺑﺒﺴـﺎﻃﺔ ﺷـﺪﻳﺪة ﻧﺴـﺘﻄﻴﻊ اﻟﻘﻮل ﻋﻦ jumpﻫﻮ اﻧﻚ ﻋﻨﺪﻣﺎ ﺗﺮ ﻳﺪ اﺳـﺘﺪﻋﺎء داﻟﺔ ﻟﺘﻨﻔﻴﺬ ﻣﺎ
ﺑﺪاﺧﻠﻬﺎ ﻓﻬﻮ ﻓﻲ ﻋﻤﻠﻴﺔ اﻻﺳﺘﺪﻋﺎء ﻳﻘﻔﺰ او ﻳﻘﻮم ﺑﻌﻤﻠﻴﺔ اﻟ ـ ــ ـ jumpإﻟﻰ اﻟﺪاﻟﺔ ﻧﻔﺴﻬﺎ ﻟﺘﻨﻔﻴﺬ ﻣﺎ
ﺑﺪاﺧﻠﻬﺎ.
{fun sumFunction(num1:Int,num2:Int):Int
return num1 + num2
}
{)>fun main(args:Array<String
}
ﻫﻨﺎ ﻧﺮى ﻓﻲ ﺟﻤﻠﺔ اﻻﺳـ ـﺘﺪﻋﺎء اﻧﻬﺎ أﺳـ ـﻨﺪت إﻟﻰ ﻣﺘﻐﻴﺮ وذﻟﻚ ﻟﺘﺨﺰ ﻳﻦ اﻟﻘﻴﻤﺔ اﻟﺮاﺟﻌﺔ ،ﻟﻮ
ﻟﻢ ﺗﻜﻦ اﻟﺪاﻟﺔ ﺗﻌﻮد ﺑﻘﻴﻤﺔ ﻓﻬﻨﺎ ﻧﺴﺘﻄﻴﻊ ان ﻧﻜﺘﻔﻲ ﺑﺎﻻﺳﺘﺪﻋﺎء ﻓﻘﻂ ﺑﺪون اﻻﺳﻨﺎد ﻟﻤﺘﻐﻴﺮ.
ـــــــــــ ــ ـــــــــــ ـ ـ ﺳـ ـــ ـﻮف ﻧﺘﻄﺮق ﻟﻤﻔﻬﻮم ﺟﺪﻳﺪ وﻫﻮ اﻟﺒﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ أو ﺷـ ـــ ـﻴﺌﻴﺔ ) ( OOPـ
) (Object-oriented programmingاﻟﺘﻲ ﺗﻬـﺪف ﻟﺠﻌـﻞ اﻟﺒﺮﻧـﺎﻣﺞ ﻋﺒـﺎرة ﻋﻦ ﻣﺠﻤﻮﻋـﺔ ﻣﻦ
اﻟﻜﺎﺋﻨﺎت او ﺑﺎﻟﻤﻔﻬﻮم اﻟﻤﺘﺪاول ﻋﻨﻪ ” ﻛﻞ ﺷـﻲء ﻋﺒﺎرة ﻋﻦ ﻛﺎﺋﻦ ” .ﻛﻞ ﻛﺎﺋﻦ ﻋﺒﺎرة ﻋﻦ ﺣﺰﻣﺔ
ﻣﻦ اﻟﺒﻴﺎﻧﺎت ،وﻳﺘﻢ ﺑﻨﺎء اﻟﺒﺮﻧﺎﻣﺞ ﺑﻮاﺳـ ـــ ـﻄﺔ اﺳـ ـــ ـﺘﺨﺪام اﻟﻜﺎﺋﻨﺎت ور ﺑﻄﻬﺎ ﻣﻊ ﺑﻌﻀـ ـــ ـﻬﺎ اﻟﺒﻌﺾ
وواﺟﻬﺔ اﻟﺒﺮﻧﺎﻣﺞ اﻟﺨﺎرﺟﻴﺔ ﺑﺎﺳـ ـﺘﺦ دام ﻫﻴﻜﻠﻴﺔ اﻟﺒﺮﻧﺎﻣﺞ وواﺟﻬﺎت اﻻﺳـ ـﺘﺨﺪام اﻟﺨﺎﺻـ ـﺔ ﺑﻜﻞ
ﻛﺎﺋﻦ .وﺗﺸﻤﻞ اﻟﺒﺮﻣﺠﺔ ﻛﺎﺋﻨﻴﺔ اﻟﺘﻮﺟﻪ ﻣﺒﺎدئ رﺋﻴﺴﻴﺔ وﻫﻲ:
• اﻟﺘﻐﻠﻴﻒ(Encapsulation).
• إﺧﻔﺎء اﻟﺒﻴﺎﻧﺎت(Data Hiding).
• اﻟﻤﻴﺮاث(Inheritance).
• ﺗﻌﺪاﻷﺷﻜﺎل(Polymorphism).
• ﻣﻦ اﻟﻠﻐﺎت اﻟﺘﻲ ﺗﻌﻤﻞ ﺑﺎﻟﻜﺎﺋﻨﻴﺔ:
• ﻟﻐﺔ ﺳﻲ++
• ﻟﻐﺔ ﺟﺎﻓﺎ
• ﻟﻐﺔ ﺑﺎﻳﺜﻮن
• ﻟﻐﺔ دﻟﻔﻲ )ﻟﻐﺔ ﺑﺮﻣﺠﺔ(
Classesﺑﺎﻟﻌﺮ ﺑﻴﺔ ﻳﻌﻨﻲ ﺗﺼـ ــ ـﻨﻴﻔﺎت وﻫﺬا ﻳﻌﻨﻲ أﻧﻨﺎ ﻧﻀـ ــ ـﻊ اﻷﺷـ ــ ـﻴﺎء ﻓﻲ ﺗﺼـ ــ ـﻨﻴﻒ ﻣﻌﻴﻦ ،
ﻟﻨﻔﺘﺮض أﻧﻨﺎ ﻧﺘﺤﺪث ﻋﻦ اﻟﺴـ ـﻴﺎرات ﺣﺴـ ـﻨﺎ ً ﻫﻨﺎﻟﻚ ﺳـ ـﻴﺎرة BMWوﻟﻪ ﻟﻮن ﻣﻌﻴﻦ وﺳـ ـﺮﻋﺎت
ﻣﻌﻴﻨﻪ وﺷـ ـﺮﻛﺔ ﺧﺎﺻـ ـﺔ ﺑﺈﻧﺘﺎﺟﻬﺎ وأ ﻳﻀـ ـﺎ ﻟﺪﻳﻨﺎ AUDIوأ ﻳﻀـ ـﺎ ﻟﻬﺎ ﺷـ ـﺮﻛﺔ ﺧﺎﺻـ ـﺔ وﻟﻮن ﻣﻌﻴﻦ
ﻋﺔ وﻣﺨﺘﻠـﻔﺔ وﻟﻜﻨﻬﻢ ﺟﻤﻴﻌﻬﻢ ﻳﻌﺘﺒﺮون ﺻـ ــــــ ـﻮرة ﻟﺼـ ــــــ ـﻨﻒ
ﻋﺔ ﻣﺘﻨﻮ ـ
ﻜﺬا ـﻟﺪﻳـﻨﺎ ﻣﺠﻤﻮ ـ
…إﻟﺦ وﻫ ـ
اﻟﺴـﻴﺎرات ،أي أﻧﻨﺎ ﻓﻲ ﺑﺮﻧﺎﻣﺠﻨﺎ ﺳـﻨﺘﺤﺪث ﻋﻦ اﻟﺴـﻴﺎرات ﺻـﺤﻴﺢ ؟ إذا ﻧﻘﻮم ﺑﺈﻧﺸـﺎء ﺗﺼـﻨﻴﻒ
ﻟﻠﺴـ ـﻴﺎرات ﻧﻌﺮف ﺑﻪ اﻟﺼـ ـﻔﺎت اﻟﻌﺎﻣﺔ ﺑﻬﺎ ﻣﺜﻞ اﻻﺳـ ـﻢ ،اﻟﺸـ ـﺮﻛﺔ اﻟﻤﺼـ ـﻨﻌﺔ ﻟﻪ ،اﻟﻠﻮن وﻧﻀـ ـﻊ
ﻛﺬﻟﻚ داﺧﻞ اﻟﺘﺼﻨﻴﻒ اﻟﺪوال اﻟﺨﺎﺻﺔ ﺑﺎﻟﺴﻴﺎرة ﻛﺎﻟﺴﺮﻋﺔ واﻟﺘﻮﻗﻒ ﻣﺜﻼ ً.
{)fun spead(sp:Int
{)if(sp > 100
)"println("Speed is slow
{} else
)"println("High speed
}
}
}
ﻫﻨﺎ ﻣﺜﺎل ﻟ ـ ـــــ ـ Classاﻟﺴﻴﺎرة وﺿﻌﻨﺎ ﺑﺪاﺧﻠﻪ اﻟﺼﻔﺎت اﻟﺘﻲ ﻋﺮﻓﻨﺎ اﻧﻨﺎ ﻧﻤﺜﻠﻬﺎ ﺑﺮﻣﺠﻴﺎ ً ﺑﺎﻟ ـ ـــــ ـ
Variablesوﻫﻲ اﻻﺳ ـﻢ واﻟﻠﻮن واﻟﻤﻮدﻳﻞ واﻟﺴ ـﻌﺮ ﻣﺜﻼ وﻟﻜﻦ ﻧﺮ ﻳﺪ ﺗﻮﺿ ـﻴﺢ أﻣﺮ ﻋﻨﺪ ﺗﻌﺮ ﻳﻒ
اﻟﻤﺘﻐﻴﺮات ﺑﺪاﺧﻞ اﻟﺘﺼﻨﻴﻒ ﻻﺑﺪ ﻣﻦ أن ﺗﻘﻮم ﺑﺘﻤﻬﻴﺪ ﻗﻴﻤﺔ ﻟﻬﺬا اﻟﻤﺘﻐﻴﺮ ﻷن ﻟﻐﺔ اﻟـ ـ kotlin
ﻻ ﺗﺴـ ــــ ـﻤﺢ ﻟﻚ ﺑﺘﻌﺮ ﻳﻔﻪ ﺑﺪون ان ﺗﻤﻬﺪ ﻟﻪ ،وﻧﻼﺣﻆ أ ﻳﻀـ ــــ ـﺎ اﻧﻨﺎ ﻻ ﻧﻘﻮم ﺑﺈﻋﻄﺎء ﻗﻴﻤﺔ ﺣﻘﻴﻘﻴﺔ
ﻛﻤﺎ ﻋﺮﻓﻨﺎ ﻓﺎﻟﻘﻴﻢ ﺗﻌﻄﻰ ﻋﻨﺪ اﻧﺸﺎء ﻛﺎﺋﻦ أﻣﺎ ﻫﻨﺎ ﻓﻨﺤﻦ ﻓﻘﻂ ﻧﻌﻄﻲ اﻟﺼﻔﺎت واﻻﻓﻌﺎل.
اﻟﻜﺎﺋﻦ ﻳﺎ ﻋﺰ ﻳﺰي ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺻـ ـﻮرة ﻟﻠﺘﺼـ ـﻨﻴﻒ اﻟﺬي أﻧﺸـ ـﺄﻧﺎه ﺳـ ـﺄوﺿـ ـﺢ ﻟﻚ اﻷﻣﺮ ﻣﺮة
أﺧﺮى وﻫﻲ أن اﻟﺴـ ــ ـﻴﺎرات ﺟﻤﻴﻌﻬﺎ ﺑﻤﺨﺘﻠﻒ أﻧﻮاﻋﻬﺎ ﺗﺠﺘﻤﻊ ﺑﺄن ﻟﻬﺎ ﺻـ ــ ـﻔﺎت ﻣﺸـ ــ ـﺘﺮﻛﺔ ﻣﺜﻞ
ﺼ ﻨﻒ
ﺸﺊ ﻣ ـ
ﺳﺮﻋﺔ ﻓﻬﻨﺎ ﻧﻨ ـ
ﺳﻴﺎرة ﺗﺤﻤﻞ ﻣﻮدﻳﻞ وﻟﻮن و ـ
ﺳﻢ وﻛﻞ ـ
ﺳﻴﺎرة ﺗﺤﻤﻞ ا ـ
ﺳﻢ ﻓﻜﻞ ـ
اﻻ ـ
ﻳﻀﻢ ﻛﻞ اﻟﺼﻔﺎت واﻻﻓﻌﺎل اﻟﺘﻲ ﺗﺸﺘﺮك ﻓﻴﻬﺎ ﻛﻞ اﻟﺴﻴﺎرات ﺣﺴﻨﺎ ً أ ﻳﻦ اﻻﺧﺘﻼف ؟ اﻻﺧﺘﻼف
ﻫﻮ ﻧﻮع اﻟﺒﻴﺎن اﻟﻤﺪﺧﻞ ﻓﺴـ ــــ ـﻴﺎرة ﻣﻦ ﻧﻮع ﻓﻮرد ﻣﺨﺘﻠﻔﺔ ﻋﻦ ﺳـ ــــ ـﻴﺎرة ﻧﻮع اودي وﻫﻜﺬا ،ﻧﻘﻮم
ﺑﺈﻧﺸﺎء اﻟﻜﺎﺋﻦ ﻓﻲ داﺧﻞ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ:
ﻫﻜﺬا ﻧﺤﻦ اﻧﺸ ـﺄﻧﺎ ﻛﺎﺋﻦ ﻋﺮﻓﻨﺎه ﻛﻤﺎ ﻧﻘﻮم ﺑﺘﻌﺮ ﻳﻒ اﻟﻤﺘﻐﻴﺮات وﻟﻜﻦ اﻻﺧﺘﻼف ﻫﻮ أﻧﻪ ﺑﻌﺪ
ﻋﻼﻣﺔ اﻟﻤﺴ ـﺎواة ﻧﻀ ـﻊ اﺳ ـﻢ اﻟﺼ ـﻨﻒ Classاﻟﺬي ﻳﺘﺒﻌﻪ اﻟﻜﺎﺋﻦ اﻟﺬي اﻧﺸ ـﺄﻧﺎه ،ﻳﻤﻜﻨﻚ أ ﻳﻀ ـﺎ
ﺗﻌﺮ ﻳﻒ أ ﻛﺜﺮ ﻣﻦ ﻛﺎﺋﻦ ﻟﻨﻔﺲ اﻟﺼﻨﻒ ﺑﺸﺮط أن ﻳﻜﻮن اﻻﺳﻢ ﻣﺨﺘﻠﻒ.
"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
ﻣﻦ اﻟﻤﻤﻜﻦ ان ﻧﺴـ ــــــ ـﺘـﺪﻋﻴﻬـﺎ ﺑـﺪاﺧـﻞ ﻣﺘﻐﻴﺮ وﻣﻦ اﻟﻤﻤﻜﻦ اﺟﺮاء اﻣﺮ اﻟﻄﺒـﺎﻋـﺔ ﻣﺒـﺎﺷـ ــــــ ـﺮة،
ﺳﻮف ﻧﻘﻮم ﺑﺎﺗﺒﺎع ﻧﻔﺲ اﻟﻄﺮ ﻳﻘﺔ:
{ )class labtop(id:Int,name:String
{)(fun getInfo
println("The labtop is : $companyName , and the serial number
)"is : $serialNum
}
}
§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ
{)>fun main (args:Array<String
ﻧﺮى أﻧﻪ أﻟﺰﻣﻨﺎ ﻋﻨﺪ إﻧﺸ ـﺎء اﻟﻜﺎﺋﻦ ﺑﺘﻤﺮ ﻳﺮ ﻗﻴﻢ ﻟﻬﺬه اﻟﻮﺳ ـﺎﺋﻂ اﻟﺘﻲ ادﺧﻠﻨﺎﻫﺎ ﻓﻲ اﻟﺘﺼ ـﻨﻴﻒ
ﻓﻮق.
ﻟﻮ ﻧﺮ ﻳﺪ أن ﻧﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻮﺳـ ــــ ـﺎﺋﻂ ﻣﺒﺎﺷـ ــــ ـﺮة ﺑﺪون ﺗﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮات ﻓﻲ داﺧﻞ ﺗﺼـ ــــ ـﻨﻴﻒ
:class
{)(fun getInfo
)"println("The labtop is : $name , and the serial number is : $id
}
}
{)(fun getInfo
)"println("The labtop is : $name , and the serial number is : $id
}
}
ﺣﺴـ ــــــ ـﻨـﺎ اﻵن ﺳـ ــــــ ـﻨﺘﻌﺮف ﻋﻠﻰ ﻓـﺎﺋـﺪة thisﻧﻼﺣﻆ ﻫﻨـﺎ أن اﻧﺸـ ـــــــ ـﺄﻧـﺎ داﻟـﺔ وﻣﺮرﻧـﺎ ﻟﻬـﺎ ﻧﻔﺲ
اﻟﻤﺘﻐﻴﺮات ﻟﻠﺘﺼﻨﻴﻒ classوﺑﺪاﺧﻞ اﻟﺪاﻟﺔ:
this.id = id
this.name = name
ﻫﺬه اﻟﻜﻠﻤﺔ ﺗﻌﻨﻲ idاﻟﺨﺎص ﺑﺎﻟﺘﺼـ ـــــ ـﻨﻴﻒ وﻟﻴﺲ idاﻟﻤﻤﺮ ﻟﻠﺪاﻟﺔ ،ﻟﻮ ﻛﺎﻧﺖ اﻟﻤﺘﻐﻴﺮات
اﻟﻤﻤﺮرة ﻟﻠﺪاﻟﺔ ذات ﻣﺴـ ـــــ ـﻤﻴﺎت ﻣﺨﺘﻠﻔﺔ ﻋﻦ اﻟﺘﻲ ﺗﻢ ﺗﻤﺮ ﻳﺮﻫﺎ ﻟﻠﺘﺼـ ـــــ ـﻨﻴﻒ ﻓﻠﻦ ﻧﺤﺘﺎج ﻟﻬﺬه
اﻟﻜﻠﻤﺔ ،ﺑﺎﺧﺘﺼﺎر ﺷﺪﻳﺪ ﻛﻠﻤﺔ thisﺧﺎﺻﺔ ﻟﻠﻮﺻﻮل إﻟﻰ ﻣﺤﺘﻮﻳﺎت اﻟﺘﺼﻨﻴﻒ.
داﻟﺔ اﻟﺒﻨﺎء ﻫﻲ ﻋﺒﺎرة ﻋﻦ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﻳﺘﻢ ﺗﻨﻔﻴﺬﻫﺎ ﻣﺒﺎﺷـ ــ ـﺮة ﻋﻨﺪ إﻧﺸـ ــ ـﺎء ﻛﺎﺋﻦ ﻣﺸـ ــ ـﺘﻖ
ﻣﻦ اﻟﺘﺼﻨﻴﻒ ،وﻳﻤﻜﻦ إﻧﺸﺎء أ ﻛﺜﺮ ﻣﻦ داﻟﺔ ﺑﻨﺎء ﺑﺪاﺧﻞ اﻟﺘﺼﻨﻴﻒ
§ ﻣﺜﺎل
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
}
ﻓﻲ اﻟﻤﺜﺎل ﻋﺮﻓﻨﺎ اﻟﻤﺘﻐﻴﺮات ﺑﻴﻦ اﻗﻮاس اﻟﺘﺼـﻨﻴﻒ وﻣﻦ ﺛﻢ ﻧﻼﺣﻆ ﺑﺪاﺧﻞ 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
أ ﻳﻀـ ــ ـﺎ ﻧﻘﻮم ﺑﺪاﺧﻠﻬﺎ ﺑﺘﻤﻬﻴﺪ اﻟﻘﻴﻢ وﻋﻨﺪ إﻧﺸـ ــ ـﺎء ﻛﺎﺋﻦ ﻳﺘﻢ اﺳـ ــ ـﺘﺪﻋﺎﺋﻬﺎ ﺗﻠﻘﺎﺋﻴﺎ ﺑﺪون اﻟﻘﻴﺎم
ﺑﻜﺘﺎﺑﺘﻬﺎ ﺑﻨﻔﺴﻚ وﺗﻨﻔﻴﺬ ﻣﺎ ﺑﺪاﺧﻠﻬﺎ.
§ ﻣﺜﺎل
{class employee
ﻗﻤﻨﺎ ﺑﺘﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮات ﺑﺪاﺧﻞ اﻟﺘﺼـ ـــــ ـﻨﻴﻒ وﻣﻦ ﺛﻢ اﻧﺸـ ـــــ ـﺄﻧﺎ داﻟﺔ ﺑﻨﺎء ﺗﻤﺮر ﻟﻬﺎ ﻣﺘﻐﻴﺮات
.وﻗﻤﻨﺎ ﺑﺈﺳﻨﺎد ﻫﺬه اﻟﻤﺘﻐﻴﺮات وﻣﻦ ﺛﻢ أﻣﺮ اﻟﻄﺒﺎﻋﺔ
§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ
var employee1 = employee("Ahmed","Aljuaid","Teacher",7000.0)
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
the name of employee is :Ahmed Aljuaid, his title job :Teacher ,and
his salary :7000.0
ﺗﻨﻮﻳﻪ
{)constructor():this("Ahmed","Aljuaid","Teacher",7000.0
}
}
ﻧﻼﺣﻆ أﻧﻨﺎ اﺳـ ـﺘﻌﻤﻠﻨﺎ ﻛﻠﻤﺔ thisاﻟﺘﻲ ﺗﻘﻮم ﺑﺎﻟﻮﺻـ ـﻮل إﻟﻰ اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﻋﺮﻓﻨﺎﻫﺎ ﻋﻨﺪ
إﻧﺸﺎء اﻟﺘﺼﻨﻴﻒ.
وﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ ﻧﻘﻮم ﻓﻘﻂ ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﺑﺪون ﺗﻤﺮ ﻳﺮ:
ﺗﺘﻨﻮع ﻫﺬه اﻟﻄﺮق وﻛﻼ ً ﺑﺤﺴﺐ ﺣﺎﺟﺘﻚ أﻧﺖ ﻋﻨﺪ إﻧﺸﺎء اﻟﺒﺮﻧﺎﻣﺞ وﺑﺤﺴﺐ ﻣﺎ ﺗﺮاه.
Inheritance
ﺳﻨﺘﻌﺮف ﻋﻠﻰ ﻃﺮ ﻳﻘﺔ اﻟﻮراﺛﺔ ﺑﺮﻣﺠﻴﺎ وﻟﻜﻦ ﺑﻌﺪ ﺗﻮﺿﻴﺢ ﺑﻌﺾ اﻟﻤﻔﺎﻫﻴﻢ اﻟﻌﺎﻣﺔ ﻛﺎﻟﺘﺎﻟﻲ:
} اﺳـﻢ اﻟﺸـﺨﺺ – ﺗﺎر ﻳﺦ اﻟﻤﻴﻼد – اﻟﺮﻗﻢ اﻟﻤﺪﻧﻲ { ،واﻧﺸـﺄﻧﺎ class Employeeﻳﺮث ﻣﻦ
class Personﻳﺤﺘﻮي ﻋﻠﻰ اﻻﺗﻲ } :اﻟﺮﻗﻢ اﻟﻮﻇﻴﻔﻲ { ،ﻓﻬﻨﺎ class Employeeﻳﺴـ ـــــ ـﺘﻄﻴﻊ
ﺣﺴـ ــــ ـﻨﺎ ً ﻧﻜﻤﻞ اﻟﺸـ ــــ ـﺮح وﻧﻼﺣﻆ أن اﻟﻮﻇﺎﺋﻒ أﻧﻮاع ﻓﻠﺪﻳﻨﺎ اﻟﻤﻌﻠﻢ وﻟﺪﻳﻨﺎ اﻟﻤﻬﻨﺪس وﻟﺪﻳﻨﺎ
ﻤﺎ أﻧﻬﻢ
ﻫﺎ اﻟﻜﺜﻴﺮ وﺟﻤﻴﻌﻬﻢ ﻳﺮﺛﻮن ﻣﻦ class Employeeوـﺑﺎﻟﻄﺒﻊ ـﻳﺎ ﻋﺰ ﻳﺰي ﺑ ـ
اﻟﻄﺒﻴـﺐ وﻏﻴﺮ ـ
ﻳﺮﺛﻮن ﻣﻨﻪ وﻫﻮ ﺑﺪوره ﻳﺮث ﻣﻦ class Personﻓﻬﻢ ﻳﺴـ ــــ ـﺘﻄﻴﻌﻮن اﻟﻮﺻـ ــــ ـﻮل إﻟﻰ ﻣﺤﺘﻮﻳﺎت
class Personأ ﻳﻀـﺎ ً ،ﻫﺬا اﻟﺸـﻲء ﻳﺸـﺒﻪ ﻛﺜﻴﺮا ﻣﺎ ﺗﻘﺪم ﺷـﺮﺣﻪ ﻓﻲ اﻟﺘﻤﻬﻴﺪ ﻓﻮق ﺑﺄن اﻟﻄﻔﻞ
ﻳﺴـﺘﻄﻴﻊ أن ﻳﺮث ﻣﻦ واﻟﺪﻳﻪ وﻟﻜﻦ ﻫﻞ ﻓﻘﻂ واﻟﺪﻳﻪ ؟ ﻻ أ ﻳﻀـﺎ ﻗﺪ ﻳﺮث ﻣﻦ ﺟﺪﻳﻪ ﺻـﻔﺎت .إذا
ﻧﺤﻦ اﻷن ﻧﻌﻠﻢ أن ﻓﻲ اﻟﻮراﺛﺔ ﻧﺴﺘﻄﻴﻊ اﻟﻮﺻﻮل إﻟﻰ ﻛﺎﻓﺔ ﻣﺤﺘﻮﻳﺎت classاﻟﻤﻮروث.
اﻟﺘﺼـﻨﻴﻒ اﻷب أو super classﻟﻜﻲ ﻧﺴـﺘﻄﻴﻊ أن ﻧﺠﻌﻞ ﺗﺼـﻨﻴﻒ أﺧﺮ ﻳﺮث ﻣﻨﻪ ﻻﺑﺪ ﻣﻦ
وﺿﻊ ﻛﻠﻤﺔ openﻋﻨﺪ إﻧﺸﺎﺋﻪ.
vﻣ ﺜﺎل
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")
}
ﻋﻨﺪ إﻧﺸـﺎء اﻟﺘﺼـﻨﻴﻒ ﻧﻘﻮم ﻓﻮرا ﺑﻌﻤﻠﻴﺔ اﻟﻮراﺛﺔ )( class Employee(): personﻧﻘﻄﺘﻴﻦ
رأﺳﻴﺘﻴﻦ وﻣﻦ ﺛﻢ اﺳﻢ اﻟﺘﺼﻨﻴﻒ اﻟﻤﻮروث.
ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﻛﺎﺋﻦ ﻣﻦ class Employeeوذﻟﻚ ﻟﺘﻮﺿﻴﺢ ﻛﻴﻒ ﺗﺘﻢ ﻋﻤﻠﻴﺔ اﻟﻮراﺛﺔ:
اﻟﺠﻮاب ﻛﺎﻟﺘﺎﻟﻲ:
• ﻧﻘﻮم ﺑﺈﻧﺸـ ــ ـﺎء ت اﻟﺘﺼـ ـ ـﻨﻴﻒ اﻟﻤﻮروث او ﻣﺎ ﻧﺴـ ـ ـﻤﻴﻪ ﺑـ ـ ـ ـ ـ ـ ـ ـ super classوﻧﻤﺮر ﻟﻪ
وﺳﺎﺋﻂ .ﻣﺜﺎل:
• ﻧﻘﻮم ﺑﺈﻧﺸﺎء sub classوﻧﻤﺮر ﻟﻪ أ ﻳﻀﺎ ﻧﻔﺲ اﻟﻮﺳﺎﺋﻂ اﻟﺬي ﺳﻴﺮﺛﻬﺎ .ﻣﺜﺎل:
§ super class
open class person{
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
}
}
ﻧﺴﺘﺨﺪم thisﻓﻲ اﻟﺘﺼﻨﻴﻒ ﻧﻔﺴﻪ وﻟﻠﺘﻌﺒﻴﺮ ﻋﻦ ﻣﺤﺘﻮﻳﺎﺗﻪ ﻛﻤﺎ ﺗﻌﻠﻤﻨﺎ ﻣﺴﺒﻘﺎ ً.
ﻧﺴـ ـــــ ـﺘﺨﺪم superﻟﻠﻮﺻـ ـــــ ـﻮل إﻟﻲ ﻣﺤﺘﻮﻳﺎت اﻟﺘﺼـ ـــــ ـﻨﻴﻒ اﻷب أي أﻧﻪ ﺧﺎص ﺑﺎﻟﺘﺼـ ـــــ ـﻨﻴﻒ
اﻟﻤﻮروث ﻟﻠﻮﺻﻮل إﻟﻴﻪ.
interface
أوﻻ ً :ﺗﻤﻬﻴﺪ
ﻫﻞ ﻗﺪ ﺧﻄﺮ ﻓﻲ ﺑﺎﻟﻚ أﺛﻨﺎء ﺗﺼــﻤﻴﻢ ﻣﺸــﺮوﻋﻚ أﻧﻚ ﺗﻌﻠﻦ ﻋﻦ داﻟﺔ وﻟﻜﻦ ﻻ ﺗﻌﻠﻢ ﻣﺎ ﻟﺬي
ﺳـﺘﻀـﻌﻪ ﺑﺪاﺧﻠﻬﺎ أو أﻧﻚ ﺗﺮ ﻳﺪ اﻹﻋﻼن ﻓﻘﻂ وﺳـﺘﺴـﺘﺨﺪﻣﻬﺎ ﻻﺣﻘﺎ ً ؟ ﻓﻲ ﺑﻴﺌﺔ Kotlinﻧﺴـﺘﻄﻴﻊ
ﻫﺬه اﻟﻌـﻨﺎﺻـ ــــــ ـﺮ ﺗﻤﻜﻨﻲ ﻣﻦ اﻹﻋﻼن ﻋﻦ
ﻣﺎ abstractأو ، interfaceـ
ﻌﻞ ذـﻟﻚ ﻋﻦ ﻃﺮ ﻳﻖ إ ـ
ﻓ ـ
ﻣﺘﻐﻴﺮات ودوال ﺑـﺪون أن أ ﻛﺘـﺐ ﻗﻄﻊ ﺑﺮﻣﺠﻴـﺔ ﺑﻤﻌﻨﻰ أﻧﻲ ﻓﻘﻂ أﻋﺮف ﻋﻦ داﻟـﺔ وﻟﻜﻨﻲ ﻣـﺎ
ﺗﺘﻀﻤﻨﻪ ﻫﺬه اﻟﺪاﻟﺔ ﺳﺄؤﺟﻞ ﻛﺘﺎﺑﺘﻪ إﻟﻰ ﺣﻴﻦ أﺣﺘﺎﺟﻪ.
ﻛﻤﺎ ﻗﻠﻨﺎ ﺳﺎﺑﻘﺎ ﻧﺴﺘﻄﻴﻊ ﻓﻴﻪ اﻹﻋﻼن ﻋﻦ اﻟﺪوال اﻟﺘﻲ ﺳﺄﺳﺘﺨﺪﻣﻬﺎ ﻻﺣﻘﺎ ً.
{interface myInterface
}
{interface myInterface
)(fun sum
)(fun sub
{)fun mul(num1:Int,num2:Int
var result = num1*num2
}
var num1:Int
}
اﻋﻠﻨﺎ ﻋﻦ داﻟﺔ ﺟﻤﻊ وﻟﻜﻦ ﺑﺪون أن ﻧﺒﻨﻲ اﻟﻘﻄﻌﺔ اﻟﺒﺮﻣﺠﻴﺔ اﻟﺨﺎﺻﺔ ﺑﻬﺎ.
اﻟﻤﺘﻐﻴﺮات اﻟﺘﻲ ﻳﺘﻢ ﺗﻌﺮ ﻳﻔﻬﺎ ﺑﺪاﺧﻞ interfaceﻻ ﻳﺘﻢ اﺳـ ـــــ ـﻨﺎد ﻗﻴﻢ ﻟﻬﺎ اﺑﺪا ،ﻛﻤﺎ ﻻﺣﻈﻨﺎ
ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮ وﻟﻢ ﻧﺴﻨﺪ ﻟﻪ ﻗﻴﻢ.
Interfaceﻻ ﻳﺘﻢ اﺳـ ــــ ـﺘﺨﺪاﻣﻬﺎ ﻣﺒﺎﺷـ ــــ ـﺮة ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴـ ــــ ـﻴﺔ وإﻧﻤﺎ ﻧﺴـ ــــ ـﺘﺨﺪﻣﻬﺎ ﺑﻌﻤﻠﻴﺔ
implementsوﻫﻲ ﺑﺎﻟﻀﺒﻂ ﻣﻤﺎﺛﻠﺔ ﻟﻌﻤﻠﻴﺔ اﻟﻮراﺛﺔ ،ﻫﻜﺬا:
ﻧﺮى أﻧﻪ ﻋﻨﺪﻣﺎ ﺟﻌﻠﻨﺎ اﻟﺘﺼ ـﻨﻴﻒ ﻳﺮث ﻣﻦ اﻟ ـ ـــــــ ـ interfaceﻗﺎم ﺑﻮﺿـﻊ ﺧﻂ اﺣﻤﺮ ،ﻟﻤﺎذا ؟
ﻌﺪ ـﻓﺈﺟـﺒﺎري أن
ﻌﻞ اﻟﺘﺼـ ــــــ ـﻨﻴﻒ ﻳﺮث ﻣﻦ interfaceوـﺑﺪاﺧـﻠﻪ دوال ﻟﻢ ﺗﺒﻨﻰ ﺑ ـ
ﻣ ﺎ ﺗﺠ ـ
ﻷـﻧﻪ ﻋﻨـﺪ ـ
ﺗﺪرﺟﻬﻢ ﺑﺪاﺧﻞ اﻟﺘﺼـ ـــــ ـﻨﻴﻒ ﻛﻠﻬﻢ أو أﺣﺪﻫﻢ ﻋﻠﻰ اﻷﻗﻞ ،ﺣﺴـ ـــــ ـﻨﺎ وﻟﻜﻦ ﻛﻴﻒ ﻳﻌﻨﻲ ادرﺟﻬﻢ ؟
ﺑﻤﻌﻨﻰ أن ﺗﻘﻮم ﺑﻌﻤﻞ overrideﻟﻠﺪاﻟﺔ ﻛﻤﺎ ﺗﻌﻠﻤﻨﺎ ﻣﺴﺒﻘﺎ ،ﺳﻨﻮﺿﺢ ذﻟﻚ اﻷن:
}
• implement membersوﻫﻮ ﻳﻌﻨﻲ ﻗﻢ ﺑﺈﺿـ ـﺎﻓﺔ اﻟﺪوال اﻟﺘﻲ ﻋﺮﻓﺘﻬﺎ وﻟﻢ ﺗﺴـ ـﺘﺨﺪﻣﻬﺎ ،
وﻫﻨـﺎ ﻧﻨﻮه ﺑـﺄﻧـﻪ إﺟﺒـﺎري اﺳـ ــــــ ـﺘﺨـﺪاﻣﻬـﺎ وﻛﺘـﺎﺑﺘﻬـﺎ ﺑﻤـﺎ أﻧـﻚ ﻗﻤـﺖ ﺑﺠﻌـﻞ اﻟﺘﺼـ ــــــ ـﻨﻴﻒ ﻳﺮث
ﻣﻦ ،interfaceأﻣﺎ اﻟﺪاﻟﺔ اﻟﺠﺎﻫﺰة اﻟﺨﺎﺻـﺔ ﺑﻌﻤﻠﻴﺔ اﻟﻀـﺮب ﻓﻨﺤﻦ ﺑﻨﻴﻨﺎﻫﺎ ﻓﻲ 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")
}
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
ﻧﺴـ ــــــ ـﺘﻄﻴﻊ ﻓﻴـﻪ ﺟﻌـﻞ اﻟـﺪوال واﻟﻤﺘﻐﻴﺮات ﻣﻌﻠﻨـﺔ ﻓﻘﻂ وﻟﻜﻦ ﺑﺸـ ــــــ ـﺮط أن ﻧﻀـ ــــــ ـﻊ ﻛﻠﻤـﺔ
abstractأﻣﺎﻣﻬﺎ ،ﺑﻤﻌﻨﻰ أن اﻟﺪوال ﻓﻲ interfaceﻛﻨﺎ ﻧﺴـ ــــ ـﺘﻄﻴﻊ أن ﻧﻌﻠﻦ ﻋﻨﻬﺎ ﻓﻘﻂ ﺑﺪون
أن ﻧﻨﺸـ ــ ـﺊ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﻟﻬﺎ ﻷﻧﻨﺎ ﺳـ ــ ـﻨﻘﻮم ﺑﺬﻟﻚ ﻓﻲ ﺗﺼـ ــ ـﻨﻴﻒ أﺧﺮ ،ﻫﻨﺎ أ ﻳﻀـ ــ ـﺎ ﻧﺴـ ــ ـﺘﻄﻴﻊ أن
ﻧﻌﻠﻦ ﻓﻘﻂ ﻋﻦ اﻟﺪاﻟﺔ ﺑﺪاﺧﻞ ﻫﺬا اﻟﺘﺼـ ــــ ـﻨﻴﻒ وﻟﻜﻦ ﻳﺸـ ــــ ـﺘﺮط أن ﻧﻀـ ــــ ـﻊ ﻛﻠﻤﺔ abstractﻷن
اﻟﺘﺼﻨﻴﻒ أﺻﻼ ﻫﻮabstract .
ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺗﺼـ ــــ ﻨﻴﻒ classوﻟﻜﻨﻪ ﻻ ﻳﻘﺒﻞ أن ﻧﻨﺸـ ــــ ﺊ ﻣﻨﻪ ﻛﺎﺋﻦ ،ﺗﺼـ ــــ ﻨﻴﻒ ﻧﺼـ ــــ ﻤﻤﻪ
ﻟﻠﻮراﺛﺔ )أي ﻟﻨﺠﻌﻞ ﺟﻤﻴﻊ ﻣﺤﺘﻮﻳﺎﺗﻪ ﻗﺎﺑﻠﺔ ﻟﻠﻮراﺛﺔ ﻟﺘﺼﻨﻴﻔﺎت أﺧﺮى(.
}
}
ﻧﺮى أـﻧﻪ ﻋـﻨﺪـﻣﺎ أردـﻧﺎ ﺗﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮ اﻋﺘﺮض ووﺿـ ــــــ ـﻊ ﺧﻂ أﺣﻤﺮ وﻋـﻨﺪ اﻟﻮﻗﻮف ﻋﻠـﻴﻪ ﻇﻬﺮ
اﻟﺴـ ــــــ ـﺒـﺐ وﻫﻮ أﻧـﻪ ﻋﻨـﺪﻣـﺎ ﺗﺮ ﻳـﺪ ﺗﻌﺮ ﻳﻒ ﻣﺘﻐﻴﺮ إﻣـﺎ أن ﺗﺠﻌـﻞ ﻟـﻪ ﻗﻴﻤـﺔ ﻣﺒـﺪﺋﻴـﺔ أو أن ﺗﺠﻌﻠـﻪ
abstractﻟﻜﻲ ﺗﺴﺘﻄﻴﻊ أﻻ ﺗﺴﻨﺪ ﻟﻪ ﻗﻴﻤﺔ أي ﻳﻌﻨﻲ ﺳﻮف ﺗﺴﺘﺨﺪﻣﻪ وﺗﺴﻨﺪ ﻟﻪ ﻓﻴﻤﺎ ﺑﻌﺪ.
راﺑﻌﺎ ً :ﻣﺜﺎل
fun sayWelcome(){
println("Welcome")
}
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
وﻟﻜﻦ ﻟﻐﺔclasses ﻳﺮث أ ﻛﺜﺮ ﻣﻦ ﺗﺼـ ـــ ـﻨﻴﻒclass اﻟﻮراﺛﺔ اﻟﻤﺘﻌﺪدة ﺗﻌﻨﻲ أن ﺗﺼـ ـــ ـﻨﻴﻒ
.ﺗﺮﻓﺾ ﻣﺒﺪأ اﻟﻮراﺛﺔ اﻟﻤﺘﻌﺪدة وﻟﺤﻞ ﻫﺬه اﻟﻤﻌﻀﻠﺔkotlin
وﻫﻲ ﻣﺎﺗﻌﻠﻤﻨﺎه ﻣﺴـ ــ ـﺒﻘﺎ ﺑﺤﻴﺚ ﻧﺴـ ــ ـﺘﻄﻴﻊ أن ﻧﻨﺸـ ــ ـﺊ ﺗﺼـ ــ ـﻨﻴﻒinterface وﺟﺪت ﻟﺪﻳﻨﺎ
: ﻣﺜﺎل،interface ﻟـimplements وأ ﻳﻀﺎ ﻧﻘﻮم ﺑﻌﻤﻞclass ﻳﺮث ﻣﻦ ﺗﺼﻨﻴﻒclass
interface showDepartment{
fun showDept()
}
ﺗﻜﻤﻦ أﻫﻤﻴﺔ ﻫﺬا اﻟﻤﻔﻬﻮم ﺑﺄﻧﻪ ﺗﺘﻴﺢ ﻟﻨﺎ اﻟﻔﺮﺻـ ـــ ـﺔ ﺑﺄن ﻧﻨﺸـ ـــ ـﺊ داﻟﺔ ﻓﻲ اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﻮارث
ﻫﻲ ﻧﻔﺴـ ــ ـﻬﺎ ﻣﻮﺟﻮدة ﻓﻲ اﻟﺘﺼـ ــ ـﻨﻴﻒ اﻟﻤﻮروث ،ﻟﺘﺒﺴـ ــ ـﻴﻂ اﻷﻣﺮ ﻓﻠﻨﻔﺘﺮض أن ﻟﺪﻳﻨﺎ ﺗﺼـ ــ ـﻨﻴﻒ
class Personوﺑﺪاﺧﻠﻪ داﻟﺔ ﺗﻘﻮم ﺑﺎﻟﻄﺒﺎﻋﺔ:
}
وﻟﺪي اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﻮارث class Employeeﻳﺮث ﺟﻤﻴﻊ ﻣﺤﺘﻮﻳﺎت class Personوﺑﻤﺎ
أﻧﻪ ﻳﺮﺛﻬﺎ ﻓﻬﺬا ﻳﻌﻨﻲ أﻧﻪ ﺳـ ـــ ـﻴﻤﻨﻌﻨﻲ ﻣﻦ ﺗﻜﺮار ﻧﻔﺲ ﻣﺴـ ـــ ـﻤﻰ اﻟﺪاﻟﺔ وﻟﻜﻦ ﻟﺘﺠﻨﺐ ﻫﺬا اﻷﻣﺮ
ﻧﺴﺘﺨﺪم ﻣﻔﻬﻮم :override
§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ
اﺳـ ـــــ ـﺘﺨﺪام ﻫﺬه اﻟﻜﻠﻤﺔ ﻣﻊ اﻟﺘﺼـ ـــــ ـﻨﻴﻒ ﻳﻌﻨﻲ أﻧﻪ ﻏﻴﺮ ﻗﺎﺑﻞ ﻟﻠﻮراﺛﺔ وﻫﺬا اﻟﺸـ ـــــ ـﻲء ﻳﺮﺟﻊ
ﻻﺧﺘﻴﺎراﺗﻚ اﻟﺸـ ــ ـﺨﺼـ ــ ـﻴﺔ ﻓﻨﺤﻦ ﻟﻨﺠﻌﻞ اﻟﺘﺼـ ــ ـﻨﻴﻒ ﻳﻘﺒﻞ اﻟﻮراﺛﺔ ﻻﺑﺪ ﻣﻦ وﺿـ ــ ـﻊ ﻛﻠﻤﺔ ،open
ﻛﺬﻟﻚ ﻣﻦ أﺟﻞ ﺟﻌﻠﻪ ﺗﺼـ ــ ـﻨﻴﻒ ﻧﻬﺎﺋﻲ ﻏﻴﺮ ﻗﺎﺑﻞ ﻟﻠﻮراﺛﺔ ﻧﻀـ ــ ـﻊ ،finalوﻳﻨﻄﺒﻖ ﻧﻔﺲ اﻟﺸـ ــ ـﻲء
ﻋﻠﻰ اﻟﺪوال.
ﻣﺜﺎل:
ﻫﻨﺎ ﺟﻌﻠﻨﺎ ﻫﺬه اﻟﺪاﻟﺔ ﻻ ﺗﻘﺒﻞ أن ﺗﻜﻮن ﻣﺮة أﺧﺮى ﻓﻴﻤﺎ ﺑﻌﺪ ،overrideﺑﻤﻌﻨﻰ ﻟﻮ أﻧﺸﺄت
ﺗﺼـ ـــــ ـﻨﻴﻒ أﺧﺮ ﺟﺪﻳﺪ ﻓﻴﻤﺎ ﺑﻌﺪ وأردت أن أﺟﻠﺐ اﻟﺪاﻟﺔ ﻧﻔﺴـ ـــــ ـﻬﺎ ﻋﻦ ﻃﺮ ﻳﻖ ، overrideﻓﻠﻦ
ﻧﺴﺘﻄﻴﻊ وذﻟﻚ ﻷﻧﻬﺎ .final
Overload
ﻓﻲ ﺑﻌﺾ اﻷﺣﻴﺎن ﻧﺼـﺎدف أ ﻛﺜﺮ ﻣﻦ ﺷـﺨﺺ ﻳﺤﻤﻠﻮن ﻧﻔﺲ اﻻﺳـﻢ وﻟﻬﻢ ﻧﻔﺲ اﺳـﻢ اﻷب
وﻟﻠﻤﺼـ ـﺎدﻓﺔ أ ﻳﻀـ ـﺎ ﻧﻔﺲ اﺳـ ـﻢ اﻟﻌﺎﺋﻠﺔ ﺻـ ـﺤﻴﺢ وﻟﻜﻨﻚ ﺗﺴـ ـﺘﻄﻴﻊ اﻟﺘﻔﺮ ﻳﻖ ﺑﻴﻦ ﺻـ ـﺪﻳﻘﻚ أي
واﺣﺪ ﻫﻮ ﻣﻨﻬﻢ وذﻟﻚ ﻷﻧﻪ ﻳﻤﺘﻠﻚ ﺧﺼـﺎﺋﺺ ﺧﺎﺻـﺔ ﺑﻪ وﺳـﻤﺎت ﺗﺪل ﻋﻠﻰ أﻧﻪ ﻫﻮ اﻟﻤﻘﺼـﻮد ،
أ ﻳﻀـ ـــــ ـﺎ ﻧﻔﺲ اﻟﺸـ ـــــ ـﻲء ﻳﺤﺪث ﻟﺪﻳﻨﺎ ﻋﻨﺪ اﻟﺒﺮﻣﺠﺔ ﺗﻮاﺟﺪ أ ﻛﺜﺮ ﻣﻦ داﻟﺔ ﻟﻬﻢ ﻧﻔﺲ اﻟﻤﺴـ ـــــ ـﻤﻰ
ﺑﺎﻟﻀ ـﺒﻂ ﻧﺴ ـﻤﻴﻪ overloadوﻟﻜﻦ ﻟﻨﺮﻛﺰ اﻧﺘﺒﺎﻫﻨﺎ ﻗﻠﻴﻼ اﻧﻪ ﻫﺬه اﻟﺪوال ﻓﻘﻂ ﻟﻬﻢ ﻧﻔﺲ اﻻﺳ ـﻢ
وﻟﻜﻦ ﻳﺨﺘﻠﻔﻮن ﻣﻦ ﺣﻴﺚ ﺗﻤﺮ ﻳﺮ اﻟﻤﺘﻐﻴﺮات وﻧﻮع اﻟﺪاﻟﺔ ﻫﻞ ﺗﺮﺟﻊ ﺑﻘﻴﻤﺔ ام ﻻ وﻫﻜﺬا.
ﻣﺜﺎل:
§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ
ﻧﻼﺣﻆ أﻧﻪ ﻋﻨﺪﻣﺎ اردﻧﺎ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ ﺑﺎﺳﻤﻬﺎ ﻃﻠﺐ ﻣﻨﺎ ان ﻧﺤﺪد أي داﻟﺔ ﻣﻨﻬﻢ ﻫﻞ اﻟﺘﻲ
ﻣﺘﻐﻴﺮاﺗﻬﺎ Intاو ﺗﻠﻚ اﻟﺘﻲ ﻣﺘﻐﻴﺮاﺗﻬﺎ .Float
{)>fun main(args:Array<String
}
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
the first function result is : 13
the second function result is : 4.2
Companion object
ﻫـﺬا اﻟﻤﻔﻬﻮم ﻳﻌﺒﺮ ﻋﻦ إﻣﻜـﺎﻧﻴـﺔ وﺻـ ــــــ ـﻮﻟـﻚ ﻟـﺪوال و ﻣﺘﻐﻴﺮات ﻣﻌﻴﻨـﺔ ﺗﻢ ﺗﻌﺮ ﻳﻔﻬـﺎ ﺑـﺪاﺧـﻞ
اﻟﺘﺼـ ــ ـﻨﻴﻒ ﺑﺪون اﺷـ ــ ـﺘﻘﺎق ﻛﺎﺋﻦ ،ﻫﺬه اﻟﻤﺘﻐﻴﺮات ﻋﻤﻠﻬﺎ ﻣﺴـ ــ ـﺘﻘﻞ ﻋﻦ ﻣﺎ ﺑﺪاﺧﻞ اﻟﺘﺼـ ــ ـﻨﻴﻒ
ﻳﻌﻨﻲ أﻧﻨﻲ اﻧﺸـ ـــ ـﺄﺗﻬﺎ ﻟﻌﻤﻞ ﻣﻌﻴﻦ ﺑﺪون ان ﺗﺮﺗﺒﻂ ﺑﺎﻟﻤﺘﻐﻴﺮات اﻷﺧﺮى أو اﻟﺪوال اﻟﺘﻲ ﺑﺪاﺧﻞ
اﻟﺘﺼﻨﻴﻒ ،وﻳﺘﻢ ﺗﻌﺮ ﻳﻒ ﻫﺬه اﻟﻤﺘﻐﻴﺮات واﻟﺪوال ﺑﺪاﺧﻞ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﺗﺴﻤﻰ companion
.object
{ companion object
}
ﺛﺎﻟﺜﺎ ً :ﻣﺜﺎل
{ class labtop
}
ﺳـ ــ ـﺘﻼﺣﻆ ﺑﺄﻧﻬﺎ ﻗﻄﻌﺔ ﺑﺮﻣﺠﻴﺔ ﻣﺴـ ــ ـﺘﻘﻠﺔ اﻧﺸـ ــ ـﺄﻧﺎ ﺑﺪاﺧﻠﻬﺎ داﻟﺔ ﺗﻘﻮم ﺑﺎﻟﺘﺮﺣﻴﺐ ،ﻛﻤﺎ ﻗﻠﻨﺎ
ﺟﻪ أي أـﻧﻪ ﻻ ﻋﻼـﻗﺔ ـﻟﻪ ﺑﻤﺤﺘﻮـﻳﺎت
ﺧ ﺎر ـ
ﻣﻪ ـ
ﺨﺪ ـ
ﻌﺔ ﻟﻦ ﺗﺴـ ــــــ ـﺘ ـ
ﻫﺬه اﻟﻘﻄ ـ
ﺧﻞ ـ
ﻣﺎ ﻳﺘﻢ ﻛﺘـﺎﺑﺘـﻪ ـﺑﺪا ـ
أـﻧﻪ ـ
اﻟﺘﺼﻨﻴﻒ اﻟﺒﺎﻗﻴﺔ.
§ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ
ﻫﻨﺎ ﻗﻤﻨﺎ ﺑﺎﺷـ ــ ـﺘﻘﺎق ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـ ــ ـﻨﻴﻒ وﻧﻼﺣﻆ أﻧﻪ ﻻ ﻳﺴـ ــ ـﺘﻄﻴﻊ اﻟﻮﺻـ ــ ـﻮل إﻟﻰ ﻣﺎ ﺑﺪاﺧﻞ
.companion object
ﻧﺴـ ـــــ ـﺘﻄﻴﻊ أن ﻧﻌﺮف ﻣﺘﻐﻴﺮ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴـ ـــــ ـﻴﺔ ﻗﻴﻤﺘﻪ ﻋﺒﺎرة ﻋﻦ companion object
ﻫﻜﺬا:
{ companion object
fun main(args:Array<String>){
tQuiz.totalQuiz()
}
ﻓﻲ ﺣﺎل أﻧﻨﺎ ﻋﺮﻓﻨﺎ ﻣﺘﻐﻴﺮات ﺑﺪاﺧﻠﻪ واﺳـ ــ ـﻨﺪﻧﺎ ﻟﻬﺎ ﻗﻴﻢ ﻓﺈﻧﻪ ﻋﻨﺪ اﺳـ ــ ـﺘﺪﻋﺎﺋﻬﺎ وﺗﻐﻴﺮ ﻗﻴﻤﺘﻬﺎ
: ﺳﻨﻮﺿﺢ ذﻟﻚ، ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ ﺳﻮف ﺗﺘﻐﻴﺮ ﺑﺸﻜﻞ ﻋﺎم أي ﻟﻴﺲ ﻓﻲ اﻷﻣﺮ ﻓﻘﻂ اﻟﻤﺤﺪد
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")
}
}
name.show()
name1.show()
}
اﻟﺘﻨﻔﻴﺬ
ﻓﻲ، ﻣﺎ ﻟﺬي ﺳـ ــ ـﻴﺤﺪثname ﺣﺴـ ــ ـﻨﺎ ﻟﻨﻼﺣﻆ ﻗﻠﻴﻼ ﻟﻮ أردﻧﺎ ﺗﻐﻴﺮ اﻻﺳـ ــ ـﻢ اﻷول ﻓﻲ ﻣﺘﻐﻴﺮ
:اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ
fun main(args:Array<String>){
name.yourName="Ali"
name.show()
name1.show()
اﻟﺘﻨﻔﻴﺬ
ﺗﻢ ﺗﻐﻴﻴﺮ اﻻﺳـ ـــــ ـﻢ ﻓﻲ اﻟﻤﺘﻐﻴﺮ ﻳﻦ name and nam1ﺑﺎﻟﺮﻏﻢ ﻣﻦ أﻧﻨﺎ اﺳـ ـــــ ـﺘﺪﻋﻴﻨﺎ name
وﻋﺪﻟﻨﺎ ﺑﻬﺎ ،وﻫﺬا ﻳﺪل ﻋﻠﻰ أﻧﻪ ﻏﻴﺮ ﻣﺴـ ــــ ـﺘﻘﻞ ﺑﺤﻴﺚ أﻧﻪ ﻗﻴﻤﺔ ﻣﺘﻐﻴﺮ ﻓﻲ ﻛﺎﺋﻦ واﺣﺪ ﻳﺠﻌﻠﻚ
ﻋﻨﺪﻣﺎ ﺗﺴﺘﺪﻋﻲ ﻧﻔﺲ اﻟﻤﺘﻐﻴﺮ ﻟﻜﺎﺋﻦ ﺟﺪﻳﺪ ﻫﻴﺎ ﻧﻔﺴﻬﺎ اﻟﻘﻴﻤﺔ.
ﻟﻐﺔ Kotlinﺗﺪﻋﻢ ﻃﺮ ﻳﻘﺔ اﻟﺘﺼـ ـــ ـﻨﻴﻔﺎت اﻟﻤﺘﺪاﺧﻠﺔ ﻫﻲ ﻋﺒﺎرة ﻋﻦ ﺗﺼـ ـــ ـﻨﻴﻒ ﻛﺒﻴﺮ وﺑﺪاﺧﻠﻪ
ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺘﺼﻨﻴﻔﺎت ،ﻳﻌﻨﻲ ﺗﻌﺮ ﻳﻒ classﺑﺪاﺧﻞ .class
{class school
{class employee
}
{class student
}
OUTER CLASS
INNER CLASS
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")
}
}
ENUM class
ﻫﻮ ﺗﺼ ـﻨﻴﻒ ﻧﺴ ـﺘﺨﺪﻣﻪ ﻟﻠﺘﻌﺪاد واﻷﺷ ـﻴﺎء اﻟﺜﺎﺑﺘﺔ اﻟﻐﻴﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻐﻴﻴﺮ ،ﻣﺜﻼ اﻷﺳ ـﺒﻮع ﻳﺒﺪأ
ﻣﻦ اﻷﺣﺪ وﻳﻨﺘﻬﻲ اﻟﺴﺒﺖ وأﺳﻤﺎء اﻷﻳﺎم ﺛﺎﺑﺘﻪ وﻣﻌﺮوﻓﺔ وﻻ ﻳﻤﻜﻦ ﻟﻚ ﺗﻐﻴﻴﺮﻫﺎ.
ﻫﻮ ﺗﺼـ ــــ ـﻨﻴﻒ ﻧﻌﺮﻓﻪ وﻧﻀـ ــــ ـﻊ ﺑﺪاﺧﻠﻪ اﻟﺸـ ــــ ـﻲء اﻟﺬي ﻧﺮ ﻳﺪ أن ﻧﺜﺒﺘﻪ ،ﺑﻤﻌﻨﻰ أﻧﻨﻲ أر ﻳﺪ أن
اﺻـ ــ ـﻤﻢ ﻣﺸـ ــ ـﺮوع ﻳﺘﺤﺪث ﻋﻦ اﻟﻌﻤﻞ ﻓﻲ أ ﻳﺎم اﻷﺳـ ــ ـﺒﻮع ﻣﺜﻼ ﻓﺄﻋﺮف ﺗﺼـ ــ ـﻨﻴﻒ واﺿـ ــ ـﻊ ﺑﻪ أ ﻳﺎم
اﻷﺳﺒﻮع اﻟﺴﺒﻌﺔ وﻋﻨﺪﻣﺎ أﻗﻮم ﺑﺎﻟﻌﻤﻞ داﺧﻞ اﻟﻤﺸﺮوع ﻟﻦ ﻳﻘﺒﻞ ﻣﻨﻲ ﻳﻮم أﺧﺮ ﻏﻴﺮﻫﻢ.
}
ھﻧﺎ اﻋﺗرض ﻷﻧﮫ ﻟﯾس ﻣن ﺿﻣن اﻟﻌﻧﺎﺻر اﻟﻣوﺟودة myDay = weekDays.Ahmed //
ﻓﻲ اﻟﺗﺻﻧﯾف
}
data class
ﻣﺎذا ﻟﻮ ﻛﺎن ﻟﺪﻳﻚ .classواردت ﻃﺒﺎﻋﺔ اﻟﻘﻴﻢ اﻟﺘﻲ داﺧﻠﻪ او ﻃﺒﺎﻋﺘﻪ ﻛ ـ ـــــــــ ـ Objectﻓﺎﻧﺖ
ﻋﻨﺪ اﻟﻘﻴﺎم ﺑﺎﻣﺮ اﻟﻄﺒﺎﻋﺔ ﺳ ـﻴﻘﻮم اﻟﻤﺘﺮﺟﻢ ﺑﻄﺒﺎﻋﺔ hashcodeﻟﻠ ـ ـــــــ ـ Objectوﻟﻴﺲ ﻟﻠﺒﻴﺎﻧﺎت!
ﺣﺘﻰ ﻟﻮ اردت اﻟﻤﻘﺎرﻧﺔ ﺑﻴﻦ ا ﻛﺜﺮ ﻣﻦ Objectﻓﺴـ ـــ ـﻴﻘﻮم اﻟﻤﺘﺮﺟﻢ ﺑﺎﻟﻤﻘﺎرﻧﺔ ﺑﻴﻦ hashcode
ﻟـﺬﻟـﻚ ﻛـﺎن ﻻﺑـﺪ ﻣﻦ ا ﻳﺠـﺎد ﻃﺮ ﻳﻘـﺔ ﺟـﺪﻳـﺪة او ﻣﻔﻬﻮم ﺟـﺪﻳـﺪ وﻫﻮ اﺳـ ــــــ ـﺘﺨـﺪام data class
واﻟﺬي ﺳـ ـﻴﻘﻮم ﺑﺠﻤﻴﻊ اﻟﻤﻬﺎم ﻣﻦ ﻣﻘﺎرﻧﺔ وﻧﺴـ ـﺦ وﻃﺒﺎﻋﺔ ﺑﺸـ ـﻜﻞ ﺳـ ـﺮ ﻳﻊ ودون ﻛﺘﺎﺑﺔ اﻟﻜﺜﻴﺮ
ﻣﻦ اﻟﺪوال واﻟﺸﻔﺮات اﻟﺒﺮﻣﺠﻴﺔ.
}
ﻻﺣﻆ ﻓﻲ ﻫﺬه اﻟﺸـ ـــــ ـﻔﺮة اﻧﺸـ ـــــ ـﺌﻨﺎ classوﻗﻤﻨﺎ ﺑﺎرﺳـ ـــــ ـﺎل ﻟﻪ اﻻﺳـ ـــــ ـﻢ واﻟﻘﻴﻤﺔ وﻧﺮ ﻳﺪ ﻋﻤﻞ
ﻋﺔ ﻟﻠﻘﻴﻢ ﻓﻲ classوﻟﻜﻦ ﻳﺘﻀـ ــــــ ـﺢ ﻟـﻨﺎ ﻫـﻨﺎ اـﻧﻪ ﻻﻳﻘﻮم ـﺑﺎﻟﻄـﺒﺎ ـ
ﻋﺔ واﻟﻤـﻘﺎرـﻧﺔ ﻣـﺜﻞ ﻣـﻘﺎرـﻧﺎت وﻃـﺒﺎ ـ
ﻣﺎﻛﺎن ﻣﺘﻮﻗﻊ ﻓﻬﻮ ﻳﻘﻮم ﺑﺎﻟﻤﻘﺎرﻧﺔ hashcodeاو ﻳﻘﻮم ﺑﻄﺒﺎﻋﺘﻪ.
اﻟﻘﻴﺎم ﺑﻬﺎ وﻳﺠﺐ ﻋﻠﻴﻚclass اﻻن ﺑﻌﺪ ان اﺗﻀـ ـــ ـﺢ ﻟﻚ ان ﺑﻌﺾ اﻟﻌﻤﻠﻴﺎت ﻻﻳﻤﻜﻦ ﻟﻠ ـ ــــــــــ ـ
ﻛﻞ ﻣﺎﻓﻲ اﻻﻣﺮ اﻧﻚ ﺗﺤﺘﺎج اﻟﻰ اﺿـ ـﺎﻓﺔkotlin وﻟﻜﻦ ﻣﻊ. ﻛﺘﺎﺑﺘﻬﺎ وﺗﻌﺮ ﻳﻔﻬﺎ ﻟﻠﻄﺒﺎﻋﺔ واﻟﻨﺴـ ـﺦ
وﺳـ ـــــ ـﺘﻜﻮن ﻗﺎدر ﻋﻠﻰ اﻟﻘﻴﺎم ﺑﺠﻤﻴﻊ اﻟﻌﻤﻠﻴﺎت ﻣﻦ ﻧﺴـ ـــــ ـﺦ وﻃﺒﺎﻋﺔclass ﻗﺒﻞ اﺳـ ـــــ ـﻢdata
.وﻣﻘﺎرﻧﺔ ﻛﻤﺎ ﺳﺘﻼﺣﻆ ﻓﻲ اﻟﺸﻔﺮة اﻟﻘﺎدﻣﺔ
ﻣﺒﺎﺷـ ـ ـﺮةsalary ﻣﻊ ﺗﻌﺪﻳﻞ ﻗﻴﻤﺔemp1 ﺗﻼﺣﻆ ﻓﻲ اﻟﺸـ ـ ـﻔﺮة اﻟﺒﺮﻣﺠﻴﺔ اﻧﻲ ﻗﻤﺖ ﺑﻨﺴـ ـ ـﺦ
.وﻧﺴﺦ اﺳﻢ اﻟﻤﻮﻇﻒ دون ﺗﻌﺪﻳﻞ
Polymorphism
وﻟﺪﻳﻨﺎ أ ﻳﻀﺎ، إذا ﻫﻲ داﻟﺔ رﺋﻴﺴﻴﺔsuper class ﻫﺬا اﻟﻤﻔﻬﻮم ﻳﻌﻨﻲ ﺑﺄن ﻟﺪﻳﻨﺎ داﻟﺔ ﻓﻲ اﻟـ
.super class ﻟﻠﺪاﻟﺔ اﻟﺘﻲ ﻓﻲoverride ﻧﻘﻮم ﺑﻌﻤﻞsub classes
(١) ﻣﺜﺎلv
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")
}
• ﻧﻼﺣﻆ أﻧﻨـﺎ ﻗﻤﻨـﺎ ﺑﻌﻤـﻞ sub classesﺑـﺪاﺧـﻞ super classوﻫـﺬا ﻟﻴﺲ ﻟﻠﺘﻌﻘﻴـﺪ
إﻧﻤﺎ ﻧﺮ ﻳﺪ ﺗﻮﺿـ ــــــ ـﻴﺢ ﺑﺄﻧﻚ ﺗﺴـ ــــــ ـﺘﻄﻴﻊ ﺻـ ــــــ ـﻨﻊ ﻧﻔﺲ اﻟﻌﻤﻞ ﺑﺄ ﻛﺜﺮ ﻣﻦ ﻃﺮ ﻳﻘﺔ )ﻛﻞ
اﻟﻄﺮق ﺗﺆدي إﻟﻰ روﻣﺎ( اﻟﻤﻬﻢ أن ﻳﻜﻮن اﻟﻌﻤﻞ ﺻﺤﻴﺢ وﻣﻨﻄﻘﻲ.
• ﻧﻼﺣﻆ أن اﻟﺘﺼـ ـﻨﻴﻒ اﻟﺮﺋﻴﺴـ ـﻲ super classﻳﺤﺘﻮي ﻋﻠﻰ داﻟﺔ ﺗﺮﺣﻴﺒﻴﺔ واﻓﺘﺮﺿـ ـﻨﺎ اﻧﻚ
ﺳـ ــ ـﺘﻤﺮر ﻗﻴﻤﺔ اﻟﺘﻲ ﻫﻲ اﺳـ ــ ـﻢ اﻟﻤﺪرﺳـ ــ ـﺔ وﻣﻦ ﺛﻢ ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ رﺳـ ــ ـﺎﻟﺔ ﺗﺮﺣﻴﺒﻴﺔ ﺑﺎﺳـ ــ ـﻢ
اﻟﻤﺪرﺳﺔ اﻟﺘﻲ ﻣﺮرﺗﻬﺎ.
• ﻗﻤﻨﺎ ﺑﻌﻤﻞ overrideﻟﻨﻔﺲ اﻟﺪاﻟﺔ ﻓﻲ sub classesوﻟﻜﻦ ﻛﻞ داﻟﺔ ﺗﻘﻮم ﺑﻌﻤﻞ ﻣﻌﻴﻦ
ﺣﺴـ ـــ ـﺐ اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﺘﻲ ﺗﺘﺒﻌﻪ ﻓﻤﺜﻼ ﺗﺼـ ـــ ـﻨﻴﻒ اﻟﻤﻮﻇﻔﻴﻦ ﻫﻲ ﻧﻔﺲ اﻟﺪاﻟﺔ ﻓﻴﻪ وﻟﻜﻦ
ﺗﻘﻮم ﺑﻄﺒﺎﻋﺔ ﻣﻌﻠﻮﻣﺔ أن ﻛﻞ ﻣﻮﻇﻒ ﻟﺪﻳﻬﻢ ﻳﺤﻤﻞ رﻗﻢ وﻇﻴﻔﻲ.
• ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ :
}
ﻧﻼﺣﻆ ﻗﻤﻨﺎ ﺑﺘﻤﺮ ﻳﺮ ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـ ـــ ـﻨﻴﻒ اﻟﺮﺋﻴﺴـ ـــ ـﻲ وﺑﺪاﺧﻞ اﻟﺪاﻟﺔ ﻫﺬه ﺟﻠﺒﻨﺎ اﻟﺪاﻟﺔ اﻟﺘﻲ
ﺗﻄﺒﻊ اﻟﺒﻴﺎﻧﺎت ،وﻣﻦ ﺛﻢ ﻋﺮﻓﻨﺎ ﻛﺎﺋﻦ ﻣﻦ اﻟﺘﺼـﻨﻴﻒ اﻟﺮﺋﻴﺴـﻲ واﺳـﺘﺪﻋﻴﻨﺎ اﻟﺪاﻟﺔ اﻟﺘﻲ ﻋﺮﻓﻨﺎﻫﺎ
وﻣﺮرﻧﺎ ﻟﻬﺎ ﻧﻔﺲ اﻟﻜﺎﺋﻦ.
• ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ:
happy kids
Welcome in to our schools happy kids
vﻣﺜﺎل )(٢
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
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){
ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺧﻄﺄ ﺣﺪث وﻟﻤﻌﺎﻟﺠﺔ ﻫﺬا اﻟﺨﻄﺄ وﺟﺪت ﻣﺎ ﺗﺴﻤﻰ ﺑﺎﻻﺳﺘﺜﻨﺎءات.
ﺗﺘﻜﻮن ﺟﻤﻠﺔ اﻻﺳـ ـﺘﺜﻨﺎء ﻣﻦ ﻗﻄﻌﺘﻴﻦ ﺑﺮﻣﺠﻴﺘﻴﻦ أﺳـ ـﺎﺳـ ـﻴﺘﻴﻦ ﻫﻲ : try , catchوﻗﻄﻌﺔ
ﺛﺎﻟﺜﺔ اﺧﺘﻴﺎر ﻳﺔ وﻫﻲ .finally :
try v
}
catch v
• ﻓﻲ اﻟـﺒﺪا ـﻳﺔ ﻧﻌﺮف ﻣﺘﻐﻴﺮ ﺑﻴﻦ اﻟﻘﻮﺳـ ــــــ ـﻴﻦ وﻧﻌﻴﻦ ﻧﻮع اﻟﻤﺘﻐﻴﺮ وﻫﻮ ﻧﻮع اﻟﺨ ـ
ﻄﺄ ﻣﻨﻄﻘﻲ ،
ر ﻳﺎﺿﻲ …إﻟﺦ
• ﺑﺪاﺧﻞ اﻟﻘﻄﻌﺔ اﻟﺒﺮﻣﺠﻴﺔ ﻧﻜﺘﺐ أواﻣﺮ ﺧﺎﺻـﺔ ﺑﻨﻮع اﻟﺨﻄﺄ اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻤﺮ ﻳﺮه ﺑﻤﻌﻨﻰ ﻟﻮ
ﻫﺬه ﻄﺄ ﻓﻲ اﻟﺒﺮـﻧﺎﻣﺞ ﻧﻮ ـ
ﻋﻪ ر ـﻳﺎﺿـ ــــــ ـﻲ ﻟﻦ ﺗﺴـ ــــــ ـﺘﻄﻴﻊ ـ ﺣﺪث ﺧ ـ
ﻄﺄ ﻣﻨﻄﻘﻲ ،و ـ
ـﻛﺎن ﻧﻮع اﻟﺨ ـ
اﻟﻘﻄﻌﺔ ﺣﻞ اﻟﻤﺸـ ـﻜﻠﺔ وﻟﺤﻞ اﻟﻤﺸـ ـﻜﻠﺔ ﻧﻘﻮم ﺑﺈﻧﺸـ ـﺎء ﻗﻄﻌﺔ catchأﺧﺮى ﻣﺨﺼـ ـﺼـ ـﺔ
ﻟﻨﻔﺲ ﻧﻮع اﻟﺨﻄﺄ.
{)catch(variable:exceptionType
}
finaly v
ﻣﺜﺎل: ً ﺛﺎﻟﺜﺎ
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
اﻟﺬي ﻳﺤﺘﻮي ﻋﻠﻰ اﻟﻌﺪﻳﺪ ﻣﻦThread class ﻟﻨﺘﻌﺎﻣﻞ ﻣﻊ ﻋﺬا اﻟﻤﻔﻬﻮم ﺳـﻨﺴـﺘﻌﻴﻦ ﺑ ـ ـــــــ ـ
: ﻣﺜﺎل.اﻟﺪوال اﻟﺘﻲ ﺗﻔﻴﺪﻧﺎ ﻓﻲ ﻣﻮﺿﻮﻋﻨﺎ ﻫﺬا
for (i in 1..3) {
num = num + i
println(num)
Thread.sleep(1000)
}
for (i in 1..3) {
num = num * i
{)>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ﺗﻘﻮم ﻫﺬه
اﻟﺪاﻟﺔ ﺑﺘﻌﻄﻴﻞ ﻋﻤﻞ اﻟﺪاﻟﺔ اﻟﺤﺎﻟﻴﺔ ﻣﺪة زﻣﻨﻴﺔ ﻣﻌﻴﻨﺔ وﻣﻦ ﺛﻢ ﺗﻌﻮد ﻟﻌﻤﻠﻬﺎ ﻣﻦ ﺟﺪﻳﺪ.
• اﻷن ﻟﻠﺘﺤﻘﻖ ﻣﻦ ﻋﻤﻠﻨﺎ ﻧﻘﻮم ﺑﻌﻤﻞ ﻛﺎﺋﻦ ﻣﻦ ﻛﻼ اﻟﺘﺼﻨﻴﻔﻴﻦ واﻟﻌﻤﻞ ﺑﻬﻤﺎ.
§ ﻧﺎﺗﺞ اﻟﺘﻨﻔﻴﺬ
1
1
3
2
6
6
–———————
The result is :6
–———————
The result is :6
Start v
run v
sleep v
Suspend v
• ﻹﻳﻘـﺎف ﻋﻤـﻞ اﻟـﺪاﻟـﺔ ﻣـﺪة ﻏﻴﺮ ﻣﺤـﺪدة ،وﻻﺳـ ــــــ ـﺘﺌﻨـﺎف ﻋﻤﻠﻬـﺎ ﻧﻘﻮم ﺑـﺎﺳـ ــــــ ـﺘـﺪﻋـﺎء اﻟـﺪاﻟـﺔ
.resume
resume v
stop v
id v
getName v
getPriority v
toString v
Interrupt v
• ﺗﻬﺘﻢ ﺑﺈﻧﺠﺎز ﺟﻤﻴﻊ اﻷواﻣﺮ اﻟﺨﺎﺻﺔ ﺑﻜﺎﺋﻦ اﻟ ـ ــ Threadوﺑﻌﺪ اﻻﻧﺘﻬﺎء ﻣﻨﻬﺎ اﻻﻧﺘﻘﺎل إﻟﻰ ﻣﺎ
ﺗﺒﻘﻰ ﻓﻲ .main
State v
any
ﻫﻮ ﻋﺒﺎرة ﻋﻦ ﺗﺼ ـﻨﻴﻒ رﺋﻴﺴ ـﻲ ﻣﻮﺟﻮد ﻓﻲ ﻟﻐﺔ Kotlinﻳﺤﺘﻮي ﺑﺪاﺧﻠﻬﺎ ﻋﻠﻰ دوال واﺣﺪاث
ﺟﺎﻫﺰة ﻟﻠﺘﻨﻔﻴﺬ ،ﻓﻲ ﺣﺎل إﻧﺸـﺎﺋﻚ ﺗﺼـﻨﻴﻒ ﺟﺪﻳﺪ ﻓﺈن ﻫﺬا اﻟﺘﺼـﻨﻴﻒ ﺗﻠﻘﺎﺋﻴﺎ ﻳﺮث ﻣﻦ ﺗﺼـﻨﻴﻒ
. anyإذا ﻳﻌﺘﺒﺮ class anyﻫﻮ super classﻟﺠﻤﻴﻊ اﻟﺘﺼﻨﻴﻔﺎت .classes