Professional Documents
Culture Documents
اﻟﻜﺎﺋﻨﺎت واﻷﺻﻨﺎف
اﻟﺒﺮﻧﺎﻣﺞ ھﻮ ﻣﺠﻤﻮﻋﺔ ﻣﻦ ﺗﻌﻠﯿﻤﺎت ﻣﺮﺗﺒﺔ وﻣﺘﺴﻠﺴﻠﺔ ﻣﻨﻄﻘﯿﺎ ﺗﺆدي ﻓﻲ اﻟﻨﮭﺎﯾﺔ ﻟﺒﻠﻮغ ھﺪﻓﺎً ﻣﺎ ھﺬا
ﻋﻦ اﻟﺒﺮاﻣﺞ ﻋﺎﻣﺔ وھﺬا ھﻮ اﻟﺘﻌﺮﯾﻒ اﻟﻤﺒﺴﻂ ﻟﻠﺒﺮﻧﺎﻣﺞ وﺑﺎﻟﺘﺎﻟﻲ ﯾﻤﻜﻦ ﺗﻌﺮﯾﻒ اﻟﺒﺮﻣﺠﺔ ﺑﺄﻧﮭﺎ
ﻋﻤﻠﯿﺔ وﺿﻊ ھﺬه اﻟﺘﻌﻠﯿﻤﺎت ﺑﺎﻟﻄﺮﯾﻘﺔ اﻟﻤﺮﺗﺒﺔ واﻟﻤﺘﺴﻠﺴﻠﺔ ﻣﻨﻄﻘﯿﺎً ﺑﺤﯿﺚ ﺗﺆدي ﻓﻲ اﻟﻨﮭﺎﯾﺔ ﻟﺒﻠﻮغ
اﻟﮭﺪف .وﻟﻤﺎ ﻛﺎﻧﺖ اﻟﺒﺮﻣﺠﺔ ﻟﻠﺤﺎﺳﺐ اﻵﻟﻲ ﻣﺜﻠﮭﺎ ﻓﻲ ذﻟﻚ ﻣﺜﻞ ﺑﺎﻗﻲ اﻟﻨﺸﺎﻃﺎت اﻹﻧﺴﺎﻧ ﯿﺔ ﻗﺪ
ﻣﺮت ﺑﻤﺮاﺣﻞ ﺗﻄﻮر ﻛﺎن ﯾﻨﺒﻐﻲ ﻋﻠﯿﻨﺎ أن ﻧﻠﻤﺢ ھﻨﺎ ﻷھﻢ ھﺬه اﻟﻤﺮاﺣﻞ ﺣﺘﻰ ﺗﺴﺘﻄﯿﻊ أن ﺗﺪرك
ﻣﻌﻨﻰ ﻋﺒﺎرة اﻟﺒﺮﻣﺠﺔ اﻟﻤﻮﺟﮭﺔ أو object orientedواﻟﺘﻲ ﯾﻄﻠﻖ ﻋﻠﯿﮭﺎ اﺧﺘﺼﺎرا ل )
. ( O.O.P
ﺣﯿﺚ ﯾﺘﻜﻮن اﻟﺒﺮاﻣﺞ ﻓﯿﮭﺎ ﻣﻦ ﻋﺪة أﺷﯿﺎء ﺑﺪﻻ ﻣﻦ إﺟﺮاءات ووﻇﺎﺋﻒ .واﻷﺷﯿﺎء ﻗﺮﯾﺒﺔ ﺟﺪا ﻣﻦ
أذھﺎﻧﻨﺎ ﺣﯿﺚ ﯾﻤﺘﻠﺊ اﻟﻌﺎﻟﻢ ﻣﻦ ﺣﻮﻟﻨﺎ ﺑﺎﻷﺷﯿﺎء ﻓﻜﻞ ﺷﻲ ﻟﮫ اﺳﻢ ﻓﮭﻮ ﺷﻲ وﻻ ﻣﺎﻧﻊ أن ﯾﻜﻮن ﺟﺰء
ﻣﻨﮫ ﺷﻲ أﺧﺮ وھﻜﺬا وإذا ﻧﻈﺮﻧﺎ ﻟﻸﺷﯿﺎء ﺣﻮﻟﻨﺎ OBJECTﻓﺴﻮف ﻧﺠﺪ أن اﻷﺷﯿﺎء أﻧﻮاع .
وﻗﺒﻞ أن ﻧﺪﺧﻞ ﻓﻲ ﺗﻔﺎﺻﯿﻞ اﻟﺒﺮﻣﺠﺔ اﻟﻤﻮﺟﮭﺔ ﺳﻨﺸﺮح اﻟﺒﺮﻣﺠﺔ اﻟﻤﮭﯿﻜﻠﺔ ﻟﻜﻲ ﺗﺮﺳﺦ اﻟﻔﻜﺮة
وﺗﺴﺘﻮﻋﺐ ﻣﻌﻨﻰ اﻟﺒﺮﻣﺠﺔ اﻟﻤﻮﺟﮭﺔ.
9.1.1اﻟﺒﺮﻣﺠﺔ اﻟﻤﮭﯿﻜﻠﺔ
أوﻻ ،ﻟﻨﺨﺘﺒﺮ ﺑﺼﻮرة ﺳﺮﯾﻌﺔ ﻛﯿﻒ ﯾﺘﻢ ﺗﺼﻤﯿﻢ اﻷﻧﻈﻤﺔ اﻟﺒﺮﻣﺠﯿﺔ ﺑ ﺎﺳﺘﺨﺪام اﻻﺗﺠﺎه اﻟﻤﮭﯿﻜﻞ
)أﺣﯿﺎﻧﺎ ﯾُﺴﻤّﻰ وﻇﺎﺋﻔﻲ .(Functional
ﻣﻌﻈﻢ اﻟﻮﻇﯿﻔﯿﺎت ﺳﺘﺤﺘﺎج إﻟﻰ ﺑﯿﺎﻧﺎت ﻣﻦ ﻧﻮع ﻣﺎ ﻟﺘﻌﻤﻞ ﻋﻠﯿﮭﺎ .اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻵﻧ ﻈﻤﺔ اﻟﻮﻇﺎﺋﻔﯿﺔ
ﻋﺎدة ﻣﺎ ﯾﺤﺘﻔﻆ ﺑﮭﺎ ﻓﻲ ﻗﺎﻋﺪة ﺑﯿﺎﻧﺎت ﻣﻦ ﻧﻮع ﻣﺎ ) أو ﻗﺪ ﯾﺤﺘﻔﻆ ﺑﮭﺎ ﻓﻲ اﻟﺬاﻛﺮة ﻛﻤﺘﻐﯿّﺮات ﺷﺎﻣﻠﺔ
. (global variables
ﻟﻨﺄﺧﺬ ﻣﺜﺎﻻ ﺑﺴﯿﻄﺎ ،ﺗﺨﯿّﻞ ﻣﻨﻈﻮﻣﺔ ﻹدارة ﻣﻌﮭﺪ ،ھﺬه اﻟﻤﻨﻈﻮﻣﺔ ﺗﺤﺘﻔﻆ ﺑﺒﯿﺎﻧﺎت اﻟﻄﻠﺒﺔ و اﻟﻤﺪرّﺑﯿﻦ
ﻓﻲ اﻟﻤﻌﮭﺪ إﺿﺎﻓﺔ ﻟﻠﻤﻌﻠﻮﻣﺎت ﺣﻮل اﻟﺪورات اﻟﻤﺘﻮﻓﺮة ،ﻛﺬﻟﻚ ﺗﻘﻮم اﻟﻤﻨﻈﻮﻣﺔ ﺑﺘﺘﺒﻊ ﻛﻞ ﻃﺎﻟﺐ و
اﻟﻔﺼﻮل اﻟﺘﻲ اﻟﺘﺤﻖ ﺑﮭﺎ.
اﻟﻤﺨﻄﻂ 9-2 diagramﻋﺒﺎرة ﻋﻦ رﺳﻢ ﻟﻜﻞ اﻟﻮﻇﯿﻔﯿﺎت ،ﻣﺠﺘﻤﻌﺔ رﻓﻖ اﻟﺒﯿﺎﻧﺎت ،و رﺳﻤﺖ
اﻟﺨﻄﻮط ﻓﯿﮭﺎ ﺣﯿﺜﻤﺎ وﺟﺪت اﻋﺘﻤﺎدﯾﺔ . dependency
ﻛﻤﺜﺎل ،ﻟﻨﺘﺨﯿّﻞ أن ﻣﻨﻈﻮﻣﺘﻨﺎ ﺗﻌﻤﻞ ﻋﻠﻰ أﻛﻤﻞ ﻣﺎ ﯾﻜﻮن ،ﻟﻜﻨﻨﺎ اﻛﺘﺸﻔﻨﺎ أن ﺗﺨﺰﯾﻦ ﺗﺎرﯾﺦ ﻣﯿﻼد
اﻟﻄﺎﻟﺐ ﻋﻠﻰ ﺷﻜﻞ ﻋﺪد ذو ﺧﺎﻧﺘﯿﻦ ﻛﻲ ﯾﻤﺜﻞ اﻟﺴﻨﺔ ﻛﺎﻧﺖ ﻓﻜﺮة ﺳﯿّﺌﺔ ،اﻟﺤﻞ اﻟﻤﺒﺪأ ھﻨﺎ ھﻮ أن ﻧﻘﻮم
ﺑﺘﻐﯿﯿﺮ ﺣﻘﻞ ﺗﺎرﯾﺦ اﻟﻤﯿﻼد ﻓﻲ ﺟﺪول اﻟﻄﻠﺒﺔ Studentsﻣﻦ ﺧﺎﻧﺘﯿﻦ إﻟﻰ أرﺑﻊ ﺧﺎﻧﺎت ﻟﺮﻗﻢ
اﻟﺴﻨﺔ.
اﻟﻤﺸﻜﻠﺔ اﻟﺠﺪﯾﺔ ﻟﮭﺬا اﻟﺘﻐﯿﯿﺮ ﺗﻨﺒﻊ ﻣﻦ أﻧﮫ ﻗﺪ ﯾﺴﺒّﺐ ﻓﻲ ﻇﮭﻮر أﺛﺎر ﺟﺎﻧﺒﯿﺔ ﻏﯿﺮ ﻣﺘﻮﻗﻌﺔ .ﻓﺒﯿﺎﻧﺎت
ﺟﺪول اﻻﻣﺘﺤﺎﻧﺎت Examو ﺟﺪول اﻟﺪورات Coursesو ﺟﺪول اﻟﻤﺪرّﺑﯿﻦ Tutorsﻛﻠﮭﺎ
) ﺑﻄﺮﯾﻘﺔ أو ﺑﺄﺧﺮى( ﺗﻌﺘﻤﺪ ﻋﻠﻰ ﺑﯿﺎﻧﺎت ﺟﺪول اﻟﻄﺎﻟﺐ ، Studentsﻟﺬا ﻗﺪ ﻧﺘﺴﺒﺐ ﻓﻲ ﻛﺴﺮ
ﺘﻐﯿﯿﺮﻧﺎ اﻟﺒﺴﯿﻂ ھﺬا ،و إﻋﺎﻗﺔ وﻇﯿﻔﯿﺎت add_studentو ﺑﻌﺾ اﻟﻌﻤﻠﯿﺎت ﺑ
،ﻓﻮﻇﯿﻔﺔ enter_for_examsو issue_certificateو expel_student
add_studentﻟﻦ ﺗﻌﻤﻞ ﺑﺎﻟﺘﺄﻛﯿﺪ ﻹﻧﮭﺎ ﺗﺘﻮﻗﻊ أن ﺗﻜﻮن اﻟﻤﻌﻠﻮﻣﺔ اﻟﺨﺎﺻﺔ ﺑﺴﻨﺔ اﻟﻤﯿﻼد ﻋﻠﻰ
ﺷﻜﻞ رﻗﻢ ﺑﺨﺎﻧﺘﯿﻦ ﺑﺪﻻ ﻣﻦ أرﺑﻊ.
إذا ،ﻟﺪﯾﻨﺎ ﻣﻌﺪل ﻛﺒﯿﺮ ﻣﻦ اﻟﻤﺸﺎﻛﻞ اﻟﻤﺤﺘﻤﻠﺔ ،و اﻷﺳﻮأ إﻧﻨﺎ ﻟﻦ ﻧﺴﺘﻄﯿﻊ ﺑﺴﮭﻮﻟﺔ ﺗﻌﯿﯿﻦ أﻣﺎﻛﻦ
اﻻﻋﺘﻤﺎدﯾﺔ ﻓﻲ اﻟﺘﻮﻟﯿﻒ codeاﻟﺘﻲ ﺳﺘﺘﺄﺛﺮ ﺑﮭﺬا اﻟﺘﻐﯿﯿﺮ.
ﻛﻢ ﻣﻦ ﻣﺮّة ﻗﻤﺖ ﺑﺘﻌﺪﯾﻞ ﺳﻄﺮ ﻓﻲ اﻟﺘﻮﻟﯿﻒ و ﺑﻜﻞ ﺑﺮاءة دون أن ﺗﻌﻲ اﻧﻚ ﺳﺒّﺒﺖ ﻋﻦ ﻏﯿﺮ ﻗﺼﺪ
ﻓﻲ ﻛﺴﺮ ﻋﻤﻠﯿﺎت أﺧﺮى ﻗﺪ ﺗﺒﺪو ﻻ ﻋﻼﻗﺔ ﻟﮭﺎ ﻓﻲ اﻟﻈﺎھﺮ؟
ﻛﺈﺷﻜﺎﻟﯿﺔ ﻋﺎم ) 2000ﺛﻐﺮة اﻷﻟﻔﯿﺔ( ذات اﻟﺘﻜﻠﻔﺔ اﻟﻌﺎﻟﯿﺔ ﻛﺎن ﺳﺒﺒﮭﺎ ﺑﺎﻟﻀﺒﻂ ھﺬه اﻟﻤﺸﻜﻠﺔ .ﻓﺤﺘﻰ
ﻟﻮ أن ﺣﻠﮭﺎ ﯾﻔﺘﺮض ﺑﮫ أن ﯾﻜﻮن ﺑﺴﯿﻄﺎ ) ﺗﻐﯿﯿﺮ ﻛﻞ ﺣﻘﻞ ﺳﻨﺔ ﻣﻦ ﺧﺎﻧﺘﯿﻦ إﻟﻰ أرﺑﻊ( ﻓﺎن
اﻟﺘﺪاﻋﯿﺎت اﻟﻤﺤﺘﻤﻠﺔ ﻟﮭﺬا اﻟﺘﻐﯿﯿﺮ اﻟﺒﺴﯿﻂ ﯾﺠﺐ اﻟﺘﺤﻘﻖ ﻣﻨﮭﺎ و ﻓﺤﺼﮭﺎ ﺑﺪﻗﺔ.
ﻓﺎﻟﻜﺎﺋﻨﺎت Objectsﻓﻲ ﻋﺎﻟﻢ اﻟﻮاﻗﻊ ﯾﻤﻜﻦ ﺗﻤﯿﯿﺰھﺎ ﺑﺸﯿﺌﯿﻦ :ﻛﻞ ﻛﺎﺋﻦ ﻓﻲ ﻋﺎﻟﻢ اﻟﻮاﻗﻊ ﻟﺪﯾﮫ
ﺑﯿﺎﻧﺎت dataو ﺳﻠﻮك . behaviourﻓﻤﺜﻼ ﺟﮭﺎز اﻟﺘﻠﻔﺎز ھﻮ ﻛﺎﺋﻦ و ﯾﻌﺎﻟﺞ ﺑﯿﺎﻧﺎت ﺑﻄﺮﯾﻘﺔ
ﺗﺠﻌﻠﮭﺎ ﺗﺘﻀﺒﻂ ﻣﻦ ﺧﻼل ﻗﻨﺎة ﻣﺤﺪدة ،ﻣﻌﺪّل اﻟﻤﺴﺢ ﯾﺘﻢ ﺗﺤﺪﯾﺪه إﻟﻰ ﻗﯿﻤﺔ ﻣﻌﯿّﻨﺔ ،ﻛﺬﻟﻚ ﻣﻌﺪّل
اﻟﺘﺒﺎﯾﻦ و ﺷﺪّة اﻹﺿﺎءة و ھﻜﺬا .اﻟﺘﻠﻔﺎز أﯾﻀﺎ ﯾﻤﻜﻨﮫ " ﯾﻘﻮم" ﺑﺄﺷﯿﺎء ،اﻟﺘﻠﻔﺎز ﯾﻤﻜﻨﮫ اﻟﺘﺸﻐﯿﻞ أو
اﻹﻗﻔﺎل ،اﻟﻘﻨﻮات ﯾﻤﻜﻦ ﺗﻐﯿ ﯿﺮھﺎ ،و ھﻜﺬا .ﻋﻠﻰ اﻟﻤﻨﻮال ﻧﻔﺴﮫ إذاً ،ﻓﺎن " ﻛﺎﺋﻨﺎت" اﻟﻌﺎﻟﻢ اﻟﺤﻘﯿﻘﻲ
ﺑﺎﻹﻣﻜﺎن ﻗﻮﻟﺒﺘﮭﺎ ﺑﻄﺮﯾﻘﺔ ﻣﺸﺎﺑﮭﺔ ﻟﻠﻘﻮاﻟﺐ اﻟﺒﺮﻣﺠﯿﺔ.
ﻟﮭﺬا اﻟﺴﺒﺐ ،ﻧﺴﻤّﻲ ھﺬه اﻟﻘﻮاﻟﺐ ﺑﺎﻟﻜﺎﺋﻨﺎت Objectsو ﻣﻨﮭﺎ ﺟﺎء ﻣﺼﻄﻠﺢ اﻟﺒﺮﻣﺠﺔ /اﻟﺘﺼﻤﯿﻢ
ﺑﺎﻟﻤﻨﺤﻰ ﻟﻠﻜﺎﺋﻦ .Object Oriented Design/Programming
وﺻﻨﺎع اﻟﻔﺌﺎت ھﻢ ﻛﻤﺎ ﻓﻲ ﻟﻌﺒﺔ اﻟﺮﺟﻞ اﻵ ﻟﻲ اﻟﺸﺮﻛﺔ اﻟﻤﺼﻨﻌﺔ ﻟﮭﺬه اﻟﻠﻌﺒﺔ واﻟﻤﺴﺘﺨﺪﻣﻮن ھﻢ
اﻷﻃﻔﺎل اﻟﺬﯾﻦ ﯾﻠﻌﺒﻮن ﺑﮭﺎ وﻻ ﯾﻌﻠﻤﻮن ﺷﯿﺌﺎ ﻋﻦ ﻃﺮﯾﻘﺔ ﻋﻤﻠﮭﺎ اﻟﺪاﺧﻠﯿﺔ ﻓﻘﻂ ﯾﺼﺪر اﻟﺼﺎﻧﻌﻮن
ﻟﻜﻲ ﯾﻌﺮف اﻟﻄﻔﻞ ﻛﯿﻒ ﯾﺴﺘﻤﺘﻊ ﺑﮭﺎ وھﻮ ﺗﻤﺎﻣﺎ ﻣﺎ ﯾﺤﺪث ﻓﻲ Manualﻟﻄﺮﯾﻘﺔ اﻻ ﺳﺘﺨﺪام
ﻛﺎﺋﻨﺎت ال . OOP
اﻵن ھﻞ ﯾﻤﻜﻦ ﻓﻌﻼ أن ﺗﻜﻮن اﻟﺒﺮﻣﺠﺔ ﺑﮭﺬه اﻟﺴﮭﻮﻟﺔ ؟
ﻣﺼﻨﻌﻮ اﻟﻔﺌﺎت ﺳﯿﻜﻮن ﺑﺎﻟﻄﺒﻊ ﻋﻠﯿﮭﻢ اﻟﻌﺐء اﻷﻛﺒﺮ أﻗﻮل ﻧﻌﻢ إذا رﻛﺰ ﻛﻞ ﻋﻠﻰ ﻋﻤﻠﮫ ،
اﻟﻤﺴﺘﺨﺪﻣﻮن ﻗﺪ ﯾﻜﻮن ﻋﻠﯿﮭﻢ ﻋﺐء وﻗﺪ ﯾﻜﻮﻧﻮن ﻓﻲ ﻗﻤﺔ ﺣﺎﻻت اﻻﺳﺘﻤﺘﺎع ﺑﮭﺬا اﻟﻜﺎﺋﻦ ،ﺣﺎﻻت
اﻻﺳﺘﻤﺘﺎع ﻓﻲ اﻟﻮاﻗﻊ ﻛﻤﺎ ﻟﺪﯾﻨﺎ اﻟﻄﻔﻞ اﻟﺬي ﯾﻠﻌﺐ ﺑﺎﻟﻜﺎﺋﻦ اﻵﻟﻲ اﻟﻜﺎﻣﻞ وھﻲ أﺧﺮ ﻣﺮاﺣﻞ
اﻟﻜﺎﺋﻦ ﻷن اﻟﻄﻔﻞ ﻟﻦ ﯾﺴﺘﺨﺪم اﻟﻜﺎﺋﻦ ﻟﯿﻄﻮره ﻟﻜﺎﺋﻦ أﺧﺮ " إﻻ إذا ﻛﻨﺎ ﻓﻲ ﻋﺎﻟﻢ ال اﺳﺘﺨﺪام
Matrixوﻧﺤﻦ ﻻ ﻧﻌﻠﻢ ! ﻓﻘﻂ ﺳﯿﻜﺘﻔﻲ ﺑﺎﻟﻠﻌﺐ ﺑﮫ ،أﻣﺎ ﻟﻮ ﻛﻨﺎ ﻓﻲ ﻣﺜﺎل أﺧﺮ ﻟﻮ ﻛﺎن اﻟﻜﺎﺋﻦ اﻟﺤﺎﻟﻲ
ﻟﺪﯾﻨﺎ ھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺤﺮك ﺳﯿﻜﻮن ھﻨﺎك ﺑﻌﺾ اﻟﻌﺐء ﻋﻠﻰ ﻣﺴﺘﺨﺪم اﻟﻜﺎﺋﻦ اﻟﺬي ﺳﯿﻘﻮم ﺑﺘﺮﻛﯿﺒﮫ
ﻣﻊ ﻋﺪة ﻛﺎﺋﻨﺎت أﺧﺮى ﻟﯿﻜﻮن ﻓﻲ اﻟﻨﮭﺎﯾﺔ ﻛﺎﺋﻨﺎ ﺟﺪﯾﺪا .ھﻨﺎ ﻧﺤﻦ ﻟﻢ ﻧﻨﺘﮭﻲ ﻣﻦ ﺳﻠﺴﻠﺔ اﻟﺘﻄﻮﯾﺮ ﻟﮭﺬا
اﻟﻜﺎﺋﻦ ﺑﻌﺪ ﻓﯿﻤﻜﻦ اﻋﺘﺒﺎر اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ﻣﻄﻮرﯾﻦ ﺑﮭﺬا اﻟﻤﻔﮭﻮم ﻣﻄﻮرو اﻟﻤﺤﺮﻛﺎت ﺳﯿﺒﯿﻌﻮﻧﮭﺎ
ﻟﻤﺼﻨﻌﯿﻦ أﺧﺮﯾﯿﻦ وﺑﮭﺬا اﻟﺘﻜﺎﻣﻞ ﻧﺒﻨﻲ واﻗﻌﻨﺎ ﻓﻲ اﻟﺤﯿﺎة ﻧﻔﺲ اﻟﻤﻔﮭﻮم ﺗﻤﺎﻣﺎ ﻣﻮﺟﻮد ﻓﻲ ﻋﺎﻟﻢ
اﻟﺒﺮﻣﺠﺔ OOPﻟﻜﻦ ﻣﻦ ﯾﺴﺘﻄﯿﻊ اﻟﻮﺻﻮل ﻟﮭﺬه اﻟﻤﺮاﺣﻞ ﻣﻦ اﻟﺘﻄﻮﯾﺮ ﻣﻦ ﻗﺎل أﻧﮫ ﻻ ﯾﻮﺟﺪ ﻟﻮ
دﺧﻠﺖ ورأﯾﺖ ﺑﺮﻣﺠﺔ اﻷﻟﻌﺎب ﺳﺘﺠﺪ اﻟﻌﺠﺐ اﻟﻌﺠﺎب .
وﻟﻮ اﺿﻄﻠﻌﺖ ﻋﻠﻰ ﻧﻤﺎذج ﻣﺤﺎﻛﺎة اﻟﻮاﻗﻊ اﻻﻓﺘﺮاﺿﻲ ﻓﮭﻲ اﻟﻘﻤﺔ ﻓﻲ اﺳﺘﺨﺪام اﻟﻜﺎﺋﻨﺎت ﻹ ﻧﮭﺎ
ﺗﺒﻨﻰ أﺳﺎﺳﺎ ﻋﻠﻰ ﻣﺤﺎوﻟﺔ ﻣﺤﺎﻛﺎة ﻛﺎﺋﻦ ﻓﻲ اﻟﻄﺒﯿﻌﺔ ﺑﺸﻜﻞ ﺣﻘﯿﻘﻲ ﺗﻤﺎﻣﺎ ﻟﯿﻌﻤﻞ ﻋﻠﻰ اﻟﻜﻤﺒﯿﻮﺗﺮ
ﺑﻨﻔﺲ ﻃﺮﯾﻘﺔ ﻋﻤﻠﮫ ﻓﻲ اﻟﻄﺒﯿﻌﺔ ﻣﺜﻼ ﻣﺘﺘﺎﺑﻌﺎت اﻷﺷﻌﺔ وﻣﺤﺎﻛﺎة ﺣﺮﻛﺔ اﻟﺮﯾﺎح واﻷﻋﺎﺻﯿﺮ
ﻣﺤﺎﻛﯿﺎت أﺣﻮال اﻟﻄﻘﺲ ﻣﺤﺎﻛﯿﺎت اﻟﺘﻔﺎﻋﻼت اﻟﻜﯿﻤﯿﺎﺋﯿﺔ وﻏﯿﺮھﺎ .
ﺔ ﺳﯿﻜﻮن اﻟﻤﻄﻮرون ﺑﺪاﯾﺔ ﻛﺎﺋﻦ ھﻮ ﻋﺒﺎرة ﻋﻦ ذرة ﻣﺜﻼ ﻓﻲ ﻣﺤﺎﻛﯿﺎت اﻟﺘﻔﺎﻋﻼت اﻟﻜﯿﻤﯿﺎﺋﯿ
ﺑﺎﻷﻟﻜﺘﺮوﻧﺎﺗﮭﺎ وﻧﻮاﺗﮭﺎ وﺑﻮزوﺗﺮوﻧﺎﺗﮭﺎ وﺑﺮوﺗﻮﻧﺎﺗﮭﺎ وﻛﻞ ﻣﺤﺘﻮﯾﺎﺗﮭﺎ ھﺬا اﻟﻜﺎﺋﻦ ﺳﯿﺪﻣﺞ ﻓﻲ ﻛﺎﺋﻦ
أﻛﺒﺮ ﻣﻨﮫ وھﻮ اﻟﺠﺰيء ﺳﯿﺘﻜﻮن ﻣﻦ ﻋﺪة ﻛﺎﺋﻨﺎت ذرة ﺛﻢ ﻧﺘﺪرج ﺣﺘﻰ ﻧﺼﻞ إﻟﻰ اﻟﻤﺎدة اﻟﻜﯿﻤﯿﺎﺋﯿﺔ
وﯾﻜﻮن ﻣﺒﺮﻣﺠﻮ اﻟﻜﺎﺋﻨﺎت اﻟﺴﻔﻠﯿﺔ ﻗﺪ اﻃﻠﻌﻮا ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﺗﻔﺎﻋﻞ اﻟﺠﺰﯾﺌﺎت ﻣﻊ ﺑﻌﻀﮭﺎ ﺑﺸﻜﻞ ﺗﺎم ﺛﻢ
ﯾﺒﺪؤون ﺑﻜﺘﺎﺑﺔ " اﻟﺪوال ،اﻟﺘﻲ ﺳﺘﻘﻮم ﺑﻌﻤﻠﯿﺔ اﻻﻟﺘﺤﺎم اﻟﺪﻣﺞ ﺑﯿﻦ اﻟﺠﺰﯾﺌﺎت وﯾﻤﻺﻧﮭﺎ ﺑﻜﻞ ﺗﻔﺎﺻﯿﻞ
اﻟﺘﻔﺎﻋﻼت ﻓﻲ اﻟﻨﮭﺎﯾﺔ ﻓﻘﻂ ﻣﺎ ﻋﻠﻰ ﻣﺴﺘﺨﺪم اﻟﻜﺎﺋﻦ اﻟﻨﮭﺎﺋﻲ وھﻮ " ﻛﺎﺋﻦ ﺑﯿﺎﻧﺎت اﻟﻤﺤﻠﻮل " إن
ﻧﺪﺧﻞ ﻟﮫ ﺑﯿﺎﻧﺎت اﻟﻤﺤﻠﻮل اﻷول واﻟﺜﺎﻧﻲ وﻧﻄﻠﺐ ﻣﻨﮫ أن ﯾﺘﻔﺎﻋﻞ ﺑﯿﻨﮭﻤﺎ وﻧﻨﺘﻈﺮ ﻧﺘﯿﺠﺔ اﻟﺘﻔﺎﻋﻞ !
ھﺬه اﻷﺷﯿﺎء ﺑﺎﻟﻄﺒﻊ ﺗﺤﺘﺎج ﻟﻜﻤﺒﯿﻮﺗﺮات ﻋﻤﻼﻗﺔ ﺳﺮﯾﻌﺔ ﻟﺘﻨﻔﺬ ﻛﻞ ھﺬا اﻟﻜﻢ ﻣﻦ اﻟﺘﻌﻠﯿﻤﺎت .
أﺣﺪ أھﻢ ﻧﻘﺎط ﺿﻌﻒ اﻟﻤﻨﺤﻰ ﻟﻠﻜﺎﺋﻦ ﻓﻲ اﻟﻤﺎﺿﻲ ھﻮ إﻧﮭﺎ ﻓﻲ اﻟﻮﻗﺖ اﻟﺬي ﺗﺘﻤﯿّﺰ ﻓﯿﮫ ﺑ ﺈﻧﮭﺎ ﻗﻮﯾﺔ
ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﺼﻨﻒ/اﻟﻜﺎﺋﻦ ،إﻻ إﻧﮭﺎ ﺿﻌﯿﻔﺔ ﻋﻨﺪ اﻟﺘﻌﺒﯿﺮ ﻋﻦ ﺳﻠﻮك اﻟﻤﻨﻈﻮﻣﺔ ﻛﻜﻞّ .اﻟﻨﻈﺮ ﻣﻦ
ﺧﻼل اﻷﺻﻨﺎف ﺷﻲء ﺟﯿّﺪ ،ﻟﻜﻦ اﻷﺻﻨﺎف ﻓﻲ ﺣﺪ ذاﺗﮭﺎ ھﻲ ﻛﯿﻨﻮﻧﺎت ﻋﻠﻰ ﻣﺴﺘﻮى ﻣﻨﺨﻔﺾ و
ﻻ ﯾﻤﻜﻦ ﻟﮭﺎ أن ﺗﺼﻒ ﻣﺎ ﺗﻘﻮم ﺑﮫ اﻟﻤﻨﻈﻮﻣﺔ ﻛﻜﻞ .ﺑ ﺎﺳﺘﺨﺪام اﻷﺻﻨﺎ ف ﻓﻘﻂ ﻓﺈن اﻷﻣﺮ ﯾﺸﺒﮫ
ﻣﺤﺎوﻟﺔ ﻓﮭﻢ ﻛﯿﻔﯿﺔ ﻋﻤﻞ اﻟﺤﺎﺳﻮب ﻣﻦ ﺧﻼل ﻓﺤﺺ ﻣﻜﻮﻧﺎت اﻟﻠﻮﺣﺔ اﻷم!
اﻻﺗﺠﺎه اﻟﺤﺪﯾﺚ و اﻟﻤﺪﻋﻮم ﺑﻘﻮة ﻣﻦ ﻗﺒﻞ UMLھﻮ ﻧﺴﯿﺎن ﻛﻞّ ﻣﺎ ﯾﺘﻌﻠّﻖ ﺑﺎﻟﻜﺎﺋﻨﺎت و اﻷﺻﻨﺎف
ﻓﻲ اﻟﻤﺮاﺣﻞ اﻟﻤﺒﻜّﺮة ﻟﻠﻤﺸﺮوع ،و اﻟﺘﺮﻛﯿﺰ ﺑﺪل ذﻟﻚ ﻋﻠﻰ ﻣﺎ ﯾﺠﺐ أن ﺗﻜﻮن اﻟﻤﻨﻈﻮﻣﺔ ﻗﺎدرة
ﺑﻌﺪ ذﻟﻚ ،و ﻣﻊ ﺗﻘﺪّم اﻟﻌﻤﻞ ﻓﻲ اﻟﻤﺸﺮوع ﯾﺘﻢ ﺗﺪرﯾﺠﯿﺎ ﺑﻨﺎء اﻷﺻﻨﺎف ﻟﺘﺠﺴﯿﺪ ﻋﻠﻰ اﻟﻘﯿ ﺎم ﺑﮫ.
اﻟﻨﻮاﺣﻲ اﻟﻮﻇﯿﻔﯿﺔ ﻟﻠﻤﻨﻈﻮﻣﺔ اﻟﻤﻄﻠﻮﺑﺔ.
ADTھﻲ ﻗﺎﻋﺪة اﻷﺳﺎس ﻓﻲ اﻟﺒﺮﻣﺠﺔ ﺑﻄﺮﯾﻘﺔ ، OOPوھﻲ اﻟﺨﻄﻮة اﻷوﻟﻰ اﻟﺘﻲ ﯾﺘﻢ ﻓﯿﮭﺎ
ﺗﺼﻤﯿﻢ وﺗﻌﺮﯾﻒ أﻧﻮاع ﺟﺪﯾﺪة .ھﺬه اﻷﻧﻮاع اﻟﺠﺪﯾﺪة ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ وﺗﺮﺟﻤﺘﮭﺎ ﻣﻦ أوﺻﺎف وأﻓﻌﺎل
اﻟﻨﻮع ﻧﻔﺴﮫ ،ﻓﺎﻷوﺻﺎف ﯾﺘﻢ اﻟﺘﻌﺒﯿﺮ ﻋﻨﮭﺎ ﺑﻤﺘﻐﯿﺮات ، Variablesو اﻷﻓﻌﺎل ﯾﺘﻢ اﻟﺘﻌﺒﯿﺮ ﻋﻨﮭﺎ
ﺑﺪوال Functionsﻛﻤﺎ ﻓﻲ اﻟﺠﺪول .9-1
ﺟﺪول 9-1
أﻓﻌﺎل أوﺻﺎف اﻟﺸﺊ /اﻟﻜﺎﺋﻦ
ﻟﻮن ،ﻋﺪد اﻷﺑﻮاب ،ﻟﻮن ،ﺗﺸﻐﯿﻞ ،إﯾﻘﺎف ،ﺗﻐﯿﯿﺮ ﺳﯿﺎرة
ﺳﺮﻋﺎت ... ، ﺳﺮﻋﺔ ،ﻧﻮع ،أﺳﻢ ..،
ﺗﺮﻛﯿﺐ ،ﺗﻨﻈﯿﻒ ، ﻟﻮن ،ﻧﻮع اﻟﻘﻤﺎش ،ﻋﺪد ﺻﺎﻟﻮن
ﻓﻚ... اﻟﻜﺮاﺳﻲ ... ،
اﻷوﺻﺎف واﻷﻓﻌﺎل اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻟﮭﺬه اﻷﻧﻮاع اﻟﺠﺪﯾﺪة ﺗﺨﺘﻠﻒ ﻣﻦ ﺑﺮﻧﺎﻣﺞ إﻟﻰ أﺧﺮ ،ﻓﻤﺜ ً
ﻼ
ﻟﻮ أردﻧﺎ أن ﻧﻘﻮم ﺑﺘﻌﺮﯾﻒ ﻧﻮع ﺳﯿﺎرة ﻻﺳﺘﺨﺪام ه ﻓﻲ ﺑﺮﻧﺎﻣﺞ ﺗﺤﻜﻢ ﺑﺎﻟﺴﺮﻋﺎت ﻓﺈن ﻟﻮن اﻟﺴﯿﺎرة
ﺳﯿﻜﻮن ﻏﯿﺮ ﻣﮭﻢ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻨﺎ.
ﯾﺴﻤﻰ ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻟﺒﯿﺎﻧﺎت اﻟﺘﺠﺮﯾﺪﯾﺔ وذﻟﻚ ﻹﻧﮭﺎ ﻻزاﻟﺖ ﺗﺤﺘﺎج إﻟﻰ ﺗﻌﺮﯾﻒ ﻣﺤﺪد
ﻻﺳﺘﺨﺪام ھﺎ ﻣﻦ ﻗﺒﻞ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ ،ﻓﻨﻮع اﻟ ﻘﻤﺎش ﻣﺜﻼً ﻋﺒﺎرة ﻋﻦ ﻣﻌﻠﻮﻣﺔ ﯾﺠﺐ ﺗﺮﺟﻤﺘﮭﺎ ﺣﺘﻰ
ﯾﻤﻜﻦ اﻟﺘﻌﺒﯿﺮ ﻋﻨﮭﺎ ،ﻓﻤﺜﻼً :
int Fabric; // 1=Blue, 2=Red….
أو
9.3اﻷﺷﯿﺎء )(Objects
ﺗﻌﺪ اﻷﺷﯿﺎء اﻟﻮﺣﺪة اﻷﺳﺎﺳﯿﺔ ﻓﻲ ﻧﻈﺎم اﻟﺒﺮﻣﺠﺔ اﻟﺸﯿﺌﯿﺔ OOP systemﺣﯿﺚ ﯾﻤﻜﻦ أن ﻧﻤﺜﻞ
ﺷﺨﺺ ،ﻣﻜﺎن ،ﺣﺴﺎب ﻓﻲ ﻣﺼﺮف ،أو ﯾﻤﻜﻦ أن ﻧﻤﺜﻞ ﺑﯿﺎﻧﺎت ﺗﻌﺮف ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻣﺜﻞ
اﻟﻤﺘﺠﮭﺎت ،vectorsاﻟﻘﻮاﺋﻢ listsوﺗﺄﺧﺬ اﻷﺷﯿﺎء ﻣﺴﺎﺣﺔ ﻓﻲ اﻟﺬاﻛﺮة وﻟﮭﺎ ﻋﻨﻮان ﻣﺜﻞ اﻟﻘﯿﻮد
ﻟﺬﻟﻚ ﻧﺴﺘﻄﯿﻊ أن ﻧﻘﻮل أن اﻟﻜﻠﻤﺔ ﺷﻲء Objectﻣﻌﻨﻰ ﻣﺤﺪد ﻓﻲ اﻟﺒﺮﻣﺠﺔ . Records
وﯾﻤﻜﻦ رﺳﻢ اﻷﺷﯿﺎء ﻛﺼﻨﺪوق ﻟﮫ ﺣﺎﻓﺎت داﺋﺮﯾﺔ ﻟﮫ اﺳﻢ اﻟﺸﻲء وﺗﻘﻊ ﺧﻮاﺻﮫ وﻣﻨﮭﺠﯿﺘﮫ داﺧﻞ
اﻟﺼﻨﺪوق واﻟﺸﻜﻞ 9-3ﯾﻤﺜﻞ رﺳﻤﯿﻦ اﻷول ) (aﯾﻤﺜﻞ ﻃﺮﻗﺘﯿﻦ ﻟﺘﻤﺜﯿﻞ ﺷﻲء وھﻮ أﻣﺎ اﻟﺮﺳﻢ
اﻟﺜﺎﻧﻲ ) (bﻓﯿﻤﺜﻞ ﺷﯿﺌﯿﯿﻦ أﺣﺪاھﻤﺎ ﯾﺮﺳﻞ رﺳﺎﻟﺔ ﻟﻸﺧﺮ.
9.4اﻟﺼﻨﻒ class
أن ﻣﺠﻤﻮﻋﺔ اﻟﺒﯿﺎﻧﺎت واﻟﺒﺮاﻣﺞ ﻟﺸﻲء ﻣﺎ ﯾﻤﻜﻦ أن ﺗﻜﻮن ﻧﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻤﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻞ
اﻟﻤﺴﺘﺨﺪم وذﻟﻚ ﺑ ﺎﺳﺘﺨﺪام اﻟﺼﻨﻒ ، classﻟﺬﻟﻚ ﻓﺈن اﻟﺼﻨﻒ ﯾﻌﺪ ﻓﻜﺮة OOPاﻟﺘﻲ ﺗﻐﻠﻒ
اﻟﺒﯿﺎﻧﺎت واﻹﺟﺮاءات اﻟﻤﺘﻄﻠﺒﺔ ﻟﻮﺻﻒ اﻟﻤﺤﺘﻮى واﻟﺴﻠﻮك ﻟﻮﺟﻮد اﻟﻌﺎﻟﻢ اﻟﺤﻘﯿﻘﻲ .وﺣﺎﻟﻤﺎ ﯾﻌﺮف
Classﯾﻤﻜﻦ أن ﺗﻮﻟﺪ ﻋﺪد ﻣﻦ اﻷﺷﯿﺎء Objectاﻟﺘﻲ ﺗﻨﺘﻤﻲ إﻟﻰ . Classوﻓﻲ ﺿﻮء ذﻟﻚ
ﻓﺈن اﻟﺼﻨﻒ Classﯾﻌﺪ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻷﺷﯿﺎء Objectاﻟﻤﺘﺸﺎﺑﮫ اﻟﻨﻮع ﻓﻌﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻓﺈن
ﺻﻨﻒ اﻟﻔﺎﻛﮭﺔ ﯾﻀﻢ أﻧﻮاﻋﺎً ﻋﺪﯾﺪة ﻣﺜﻞ اﻟﺘﻔﺎح واﻟﺒﺮﺗﻘﺎل و اﻟﻤﻨﺠﺔ وﻏﯿﺮھﺎ.
ﺻﻨﻒ واﺣﺪ ﻣﺘﻰ ﻣﺎ ﻗﺪﻣﺖ ﻧﻔﺲ اﻟﺴﻄﺢ اﻟﺒﯿﻨﻲ ﻟﻠﻌﺎم اﻟﺨﺎرﺟﻲ، وﯾﻤﻜﻦ اﻟﻘﻮل أن ﺷﯿﺌﺎن إﻟﻰ
ﻓﻀﻼً ﻋﻦ اﺳﺘﺨﺪام ھﻤﺎ ﻧﻔﺲ ھﯿﻜﻞ اﻟﺨﻮاص ﻓﻲ ﺗﺨﺰﯾﻦ ﺑﯿﺎ ﻧﺎﺗﮭﺎ اﻟﺪاﺧﻠﯿﺔ وﻧﻔﺲ اﻟﻤﻨﮭﺠﯿﺔ ﻓﻲ
اﻻﺳﺘﺨﺪام ﻟﻠﺮﺳﺎﺋﻞ.
وﯾﻀﻢ اﻟﺼﻨﻒ Classﺳﻄﺢ ﺑﯿﻨﻲ Interfaceوھﯿﻜﻞ ﺧﻮاص وﻣﻨﮭﺠﯿﺔ ﻟﻸﺷﯿﺎء اﻟﺘﻲ ﺗﻨﺘﻤﻲ
ﻟﮭﺎ .ﺣﯿﺚ ﯾﺒﯿﻦ ﺷﻜﻞ 9-4ﺑﺴﯿﻂ ﺟﺪا ﻣﻦ ﺻﻨﻒ اﻟﺤﺴﺎب اﻟﺒﻨﻜﻲ ،واﻟﺬي ﯾﺤﻮي ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت
واﻟﻌﻤﻠﯿﺎت :
9.4.1إﻧﺸﺎء اﻷھﺪاف
ﯾﺘﻢ ﺗﻌﺮﯾﻒ اﻷﺻﻨﺎف ﻓﻲ ﻟﻐﺔ Javaﻋﻦ ﻃﺮﯾﻖ اﻟﻜﻠﻤﺔ اﻟﻤﺤﺠﻮزة ،classﺣﯿﺚ ﯾﺘﺒﻌﮭﺎ اﺳﻢ
وﻋﻨﺪ اﺧﺘﯿﺎر اﺳﻢ ﻟﻠﺼﻨﻒ ﻻ ﺑﺪ ﻣﻦ ﺗﻄﺒﯿﻖ اﻟﻘﻮاﻋﺪ اﻟﺨﺎﺻﺔ ﺑﺎﻷﺳﻤﺎء .واﻟﻤﺜﺎل اﻟﺼﻨﻒ،
Account.Javaﯾﺒﯿﻦ ﻛﯿﻔﯿﺔ ﺗﻌﺮﯾﻒ اﻟﺼﻨﻒ ، Accountﻟﻜﻦ دون وﺟﻮد ﺟﻤﻞ ﺗﻨﻔﯿﺬﯾﺔ
ﻷﻧﮫ ﻟﻠﺘﻮﺿﯿﺢ ﻓﻘﻂ.
1. // Bank
{ 2. public class Chp9_1
{ )3. public static void main(String[] args
;)(4. Account acc =new Account
;)5. acc.deposit(1000
6. }
} 7.
ﺷﺮح اﻟﻤﺜﺎل:
ﻓﻲ اﻟﺴﻄﺮ 4ﺗﻢ ﺗﻌﺮﯾﻒ وإﻧﺸﺎء اﻟﻤﺘﻐﯿﺮ accﻟﯿﺼﺒﺢ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع accountوھﺬا ﯾﻌﻨﻲ أن
ﺗﻘﻮم ﺑﺈﻧﺸﺎء ھﺬا اﻟﻜﺎﺋﻦ ﺑﻌﺪ اﺳﺘﺪﻋﺎء اﺣﺪى اﻟﻤﺘﻐﯿﺮ accﯾﺸﯿﺮ إﻟﻰ ﻛﺎﺋﻦ ﻣﻦ ﻧﻮع new
اﻟﺒﺎﻧﯿﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﺼﻨﻒ . Accountوﻓﻲ اﻟﺴﻄﺮ 5ﺗﻤﺖ اﺳﺘﺪﻋﺎء اﻟﻄﺮﯾﻘﺔ depositﻓﻲ
داﺧﻞ اﻟﻜﺎﺋﻦ ، accوذﻟﻚ ﺑﻜﺘﺎﺑﺔ اﺳﻢ اﻟﻜﺎﺋﻦ ﻣﺘﺒﻮﻋﺎ ﯾﺎﺳﻢ اﻟﻤﻨﮭﺞ ﯾﻔﺼﻞ ﺑﯿﻨﮭﺎ ﻧﻘﻄﺔ .واﻟﺸﻜﻞ 9-
5ﯾﺒﯿﻦ ﻣﺤﺘﻮى اﻟﻜﺎﺋﻦ .acc
اﻟﺮﺋﯿﺴﻲ أي ﺑﺎﻧﻲ ﺑﺸﻜﻞ ﺻﺮﯾﺢ ﻓﺄﻧﺔ ﺗﻠﻘﺎﺋﯿﺎُ ﯾﺘﻢ إذا ﻟﻢ ﯾﻌﺮف Class
ﺗﻌﺮﯾﻒ ﺑﺎﻧﻲ اﻓﺘﺮاﺿﻲ وھﺬا اﻟﻜﻮد ﯾﺒﯿﻦ ذﻟﻚ.
}{ 1. class Bird
{ 2. class Chp9_2
{ )3. public static void main(String[] args
;)(4. Bird nc = new Bird
5. }
} 6.
ﻣﻦ اﻷﺧﻄﺎء اﻟﻤﺮﺗﻜﺒﺔ وﺿﻊ ﻛﻠﻤﺔ void or intﻗﺒﻞ اﺳﻢ اﻟﺒﺎﻧﻲ ﻓﯿﺼﺒﺢ
ﻃﺮﯾﻘﺔ وﻟﯿﺲ ﺑﺎﻧﯿﺎً .
ﺷﺮح اﻟﻤﺜﺎل:
ﻧﻼﺣﻆ ﻣﻦ ﻛﻮدﻧﺎ اﻟﺴﺎﺑﻖ اﻧﮫ ﻋﻨﺪﻣﺎ ﺗﺮﯾﺪ ﺗﻔﻌﯿﻞ دوال ﺑﻨﺎء Classﻧﻔﺴﮫ ﯾﺘﻢ ﺑــ newﺗﻢ اﺳﻢ
داﻟﺔ اﻟﺒﻨﺎء أو ﺑﺈﻧﺸﺎء ھﺪف ﻣﻦ ﻧﻮع . Chp9_3 m=new Chp9_3(); Class
دوال اﻟﺒﻨﺎء ﺗﺴﺒﻖ أي ﺟﻤﻞ ﻣﻜﺘﻮﺑﺔ ﺑﺪاﺧﻞ اﻟﻜﻮد ﻓﯿﻨﻔﺬ اﻟﺒﺮﻧﺎﻣﺞ أوﻻ داﻟﮫ اﻟﺒﻨﺎء اﻷوﻟﻰ
ﺛﻢ اﻟﺜﺎﻧﯿﺔ ﺛﻢ ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ .
وﻓﻲ ﻛﻮدﻧﺎ اﻷﺗﻲ ﯾﺨﺘﻠﻒ اﻷﻣﺮ
ﺷﺮح اﻟﻤﺜﺎل:
ﻧﻼﺣﻆ أﻧﺔ ﺗﻢ ﺗﻨﻔﯿﺬ ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ اﻟﺘﻲ ﺧﺎرج اﻟﺪاﻟﺔ اﻟﺮﺋﯿﺴﯿﺔ اﻟﺘﻲ ﺑﺪاﺧﻞ Blockات اﻟﻤﺴﻤﺎة
ﻋﻨﺪ ﺗﻨﻔﯿﺬ داﻟﺔ اﻟﺒﻨﺎء اﻷوﻟﻰ وﻣﺮة ﻋﻨﺪ ﺗﻨﻔﯿﺬ داﻟﺔ اﻟﻜﺘﻞ اﻟﻤﻌﺸﻌﺸﺔ ﻓﻲ اﻟﺴﻄﺮ 4ﻣﺮﺗﺎن ﻣﺮة
اﻟﺒﻨﺎء اﻟﺜﺎﻧﯿﺔ 0
وﻣﻦ اﻟﻤﻼﺣﻆ أن ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ Chp9_3ﻛﺎﻧﺖ داﻟﺔ اﻟﺒﻨﺎء ﺗﺴﺒﻖ أي ﺟﻤﻞ ﻣﻜﺘﻮﺑﺔ وﻻ ﻛﻦ
ﻓﺄي ﺟﻤﻞ ﻣﻜﺘﻮﺑﺔ ﺑﺪاﺧﻞ ﺑﻠﻮﻛﺎت وﻣﻮﻗﻌﮭﺎ ﺧﺎرج اﻟﺪاﻟﺔ اﻟﺮﺋﯿﺴﯿﺔ ﻓ ﺈﻧﮭﺎ ھﻨﺎ اﻷﻣﺮ ﯾﺨﺘﻠﻒ اﻵن
ﺗﺴﺒﻖ ﺗﻨﻔﯿﺬ داﻟﺔ اﻟﺒﻨﺎء .
ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ اﻟﺴﺎﺑﻘﺔ ﻓﻲ اﻟﺴﻄﺮ 3ﻻ ﺗﻨﻔﺬ إﻃﻼﻗﺎ إﻟﻰ إذا ﺣﺪث إﻃﻼق ﻟﻠﻔﺌﺔ.
ﻋﺪم ﺗﻨﻔﯿﺬ داﻟﺔ اﻟﺒﻨﺎء1. //
{ 2. class Chp9_5
3. };)"{System.out.println("by
{)][4. public static void main(String args
;)"5. System.out.println("start
} 6.
} 7.
ﺷﺮح اﻟﻤﺜﺎل:
ﻧﻼﺣﻆ أن اﻟﻤﺤﺮر ﻧﻔﺬ ﻣﺤﺘﻮى staticﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ 10ﺛﻢ ﻣﺤﺘﻮى اﻟﻜﺘﻠﺔ اﻟﻤﻌﺸﻌﺸﺔ ﻓﻲ
اﻟﺴﻄﺮ 8ﺛﻢ داﻟﺔ اﻟﺒﻨﺎء ﻓﻲ اﻟﺴﻄﺮ . 7
ﻗﺒﻞ ﻛﻞ ﺷﻲء ﺣﺘﻰ وان ﻟﻢ ﯾﺘﻢ إﻃﻼق Class داﺋﻤﺎً ﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻣﺤﺘﻮى static
ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ:
ﺗﻨﻔﯿﺬ اﻟﺠﻤﻞ اﻻﺳﺘﺎﺗﯿﻜﺔ 1. //
{ 2. class Chp9_7
{)][3. public static void main(String args
4. ;)"System.out.println("by
5. }
6.
7. };)"static{System.out.println("start
} 8.
ﻣﻘﺎرن اﻷھﺪاف9.4.5
، (<= , < , > , >=) Operator ﻓﻲ ﻓﺼﻞ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﺗﻌﺮﻓﻨﺎ إﻟﻰ ﻣﻮﺿﻮع اﻟﻤﺆﺛﺮات
وھﺬه اﻟﻤﺆﺛﺮات ﺗﻌﻤﻞ ﻓﻘﻂ ﻣﻊ اﻷﻧﻮاع اﻟﻤﺒﯿﻨﺔ ﻓﻲ اﻟﻠﻐﺔ وإذا ﺣﺎوﻟﺖ اﺳﺘﺨﺪام ھﺎ ﻣﻊ اﻷھﺪاف
.ﻓﺴﯿﻘﻮم اﻟﻤﺘﺮﺟﻢ ﺑﺈﺻﺪار رﺳﺎﺋﻞ ﺧﻄﺎء
=!( ﻓﺎﻷول ﯾﻘﻮم ﺑﻔﺤﺺ اﻟﻤﺴﺎواة، ==) وﻟﻜﻦ ﯾﻮﺟﺪ اﺳﺘﺜﻨﺎء ﻣﻦ ھﺬه اﻟﻤﺆﺛﺮات وھﻤﺎ اﺛﻨﺎن
وﻟﻜﻦ ﻓﻲ ﻷھﺪاف ﯾﺨﺘﻠﻒ ﻋﻤﻠﮭﺎ ﻓﻲ اﻷھﺪاف ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل ، واﻟﺜﺎﻧﻲ ﯾﻘﻮم ﺑﻨﻔﻲ اﻟﻤﺴﺎواة
:اﻟﺘﺎﻟﻲ
رﻏﻢ إﻧﻨﺎ ﺳﺎوﯾﻨﺎ ﻣﺤﺘﻮى اﻟﻜﻼﺳﯿﻦ إﻻ إﻧﻨﺎ ﻧﺠﺪ ﻧﺎﺗﺞ أﻣﺮ اﻟﻄﺒﺎﻋﺔ falseواﻟﺴﺒﺐ اﻟﺴﻄﺮ 13
ذﻛﺮﻧﺎه ﺳﺎﺑﻘﺎً.
ﺷﺮح اﻟﻤﺜﺎل:
ﯾﺴﺘﺪﻋﻲ اﻟﻤﻨﮭﺞ mainاﻟﻤﻨﮭﺞ funﺣﯿﺚ ﯾﻤﺮر ﻟﮫ اﻟﻜﺎﺋﻦ ) (expﻛﺒﺮاﻣﺘﺮ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ
اﻟﺬي ﺑﺪاﺧﻞ اﻟﺼﻨﻒ ﺑﺎﺳﺘﺪﻋﺎء اﻟﻤﻨﮭﺞ Simple_fun ﻓﯿﻘﻮم اﻟﻤﻨﮭﺞ fun ، 11
، Chp9__11ﺣﯿﺚ ﺗﻌﯿﺪ ﻗﯿﻤﺔ رﻣﺰﯾﺔ ﻣﻦ ﻧﻮع Stringﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .20
ﻓﯿﻜﻮن ﻧﺎﺗﺞ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ :
اﻟﻤﺘﺤﻮل countﻓﻲ اﻟﺴﻄﺮ 2ﻣﺘﺤﻮل ﻋﺎم ﻟﺠﻤﯿﻊ اﻟﻔﺌﺎت اﻟﻤﺸﺘﻘﺔ أي إي ﺗﻐﯿﺮ ﻟﺔ ﻓﻲ
أي ﻓﺌﺔ ﺗﺘﻐﯿﺮ ﻗﯿﻤﺘﮫ ﻓﻲ ﺟﻤﯿﻊ اﻟﻔﺌﺎت ﺑﺴﺒﺐ ﻛﻮﻧﮫ ﻣﻦ ﻧﻮع .static
9.4.9اﻟﻜﻠﻤﺔ ) - : ( final
ﺑﻤﺎ ﻣﻌﻨﻰ ﺛﺎﺑﺖ أي ﻻ ﻧﺴﺘﻄﯿﻊ ﺗﻐﯿﺮه وﻟﮭﺎ ﻋﺪة اﺳﺘﻌﻤﺎﻻت ﻓﺎن ذﻛﺮت ﻣﻊ
/ Final classﻓﺈﻧﻨﺎ ﻻ ﻧﺴﺘﻄﯿﻊ ﺗﻮرﯾﺚ . Class •
/ Final functionﻓﺈﻧﻨﺎ ﻻ ﻧﺴﺘﻄﯿﻊ ﻋﻤﻞ . override •
:ﺷﺮح اﻟﻤﺜﺎل
إﻻ إذا3 اﻟﺬي ﻓﻲ اﻟﺴﻄﺮI وھﻮ اﺳﺘﺨﺪام ﻣﺘﻐﯿﺮ ﻣﺤﺠﻮب ﻋﻦ اﻟﻤﺘﺮﺟﻢ ﻓﻠﻦ ﯾﻘﺪر أن ﯾﺼﻞ إﻟﻰ
.static ﻣﻦ ﻧﻮعI أو ﻧﺠﻌﻞClass أﻃﻠﻘﻨﺎ ھﺪف ﻣﻦ ﻧﻮع
ﺷﺮح اﻟﻤﺜﺎل:
ﻧﻼﺣﻆ اﻧﮫ ﻋﻨﺪﻣﺎ أرﺳﻠﻨﺎ اﻟﻘﯿﻤﺔ 30إﻟﻰ Iﻟﻠﻔﺌﺔ dﻓﺎن ﻗﯿﻤﺔ Iﻗﺪ ﺗﻐـﯿـﺮت ﻣﻦ 20إﻟﻰ 30ﺗﺒﻌ ًﺎ
ﻓﺄﻧﺔ ﺗـﺘـﻐـﯿﺮ ﺟﻤﯿﻊ ﻟﻠﻘﯿﻤﺔ اﻷﺧﯿﺮة ﻓﮭﺬا ﯾﻌﻨﻲ أن أي ﺗﻐﯿﺮ ﻟﻠﻤﺘﻐﯿﺮات ﻣﻦ ﻧﻮع static
ﻣﺘـﻐـﯿﺮات اﻟﻔﺌﺎت اﻟﺘﻲ ﻣﻦ ﻧﻮع staticﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .11
ﺷﺮح اﻟﻤﺜﺎل:
ﻋﻨﺪ ﺗﺘﺒﻊ أي ﺑﺮﻧﺎﻣﺞ ﻓﻌﻠﯿﻚ أن ﺗﺮﺳﻢ ھﯿﻜﻞ Classﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ 9-6ﻟﻜﻲ ﯾﺴﮭﻞ ﻋﻠﯿﻚ إﯾﺠﺎد
ﺧﺮج اﻟﺒﺮﻧﺎﻣﺞ :
p q
x y Count x y Count
Origin Origin
ﺷﻜﻞ 9-6
ﻓﻤﻦ اﻟﻤﻼﺣﻆ إﻧﻨﺎ ﻟﺪﯾﻨﺎ ﻓﺌﺘﺎن q , pوﺗﻢ إﺳﻨﺎد ﻟﮭﻢ ) (1,1و ) (2,2وداﺧﻞ ﻛﻞ ﻓﺌﺔ ﻓﺌﺔ داﺧﻠﯿﺔ
ﻟﮭﺎ ھﯿﻜﻞ ﺑﻨﻔﺲ ھﯿﻜﻞ اﻟﻔﺌﺔ اﻟﺨﺎرﺟﯿﺔ ﻓﺒﻌﺪ اﺷﺘﻘﺎق اﻟﻔﺌﺎت وإرﺳﺎل اﻟﻘﯿﻢ ﻟﮭﺎ ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ ) 10
(- 9ﺗﻜﻮن اﻟﻔﺌﺎت ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ : 9-7
ﺑﻌﺪ ﺗﻨﻔﯿﺬ اﻟﺴﻄﺮ 11ﺗﺼﺒﺢ أﺷﻜﺎل اﻟﻔﺌﺎت وﻗﯿﻤﮭﺎ داﺧﻞ اﻟﺬاﻛﺮة ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ :9-8
ﺷﻜﻞ 9-8
9.5اﻟﻜﺒﺴﻠﺔ .Encapsulation
إن ﻋﻤﻠﯿﺔ ﺗﻐﻠﯿﻒ أو ﻟﻒ اﻟﺒﯿﺎﻧﺎت واﻟﺪوال ﻓﻲ وﺣﺪة واﺣﺪة ﺗﺴﻤﻰ اﻟﺘﻐﻠﯿﻒ )(Encapsulation
وﺑﺬﻟﻚ ﻓﺈن ﺧﻮاص اﻟﺸﻲء وﻣﻨﮭﺠﯿﺘﮫ ﺗﻜﻮن داﺧﻞ اﻟﺼﻨﺪوق وﺑﺸﻜﻞ ﺣﺰﻣﺔ واﺣﺪة وﯾﺘﻀﺢ ،
ﺷﻜﻞ أﻋﻼه أن اﻟﺼﻨﺪوق ﻣﻘﺴﻢ إﻟﻰ ﺟﺰﯾﺌﯿﻦ:
ﺷﻜﻞ 9-9
ﻗﺪ ﺗﻜﻮن ﻋﺰﯾﺰي اﻟﻘﺎرئ ﻋﺪﻧﻚ ﺧﺒﺮة ﺳﺎﺑﻘﺔ ﻓﻲ اﻟﺒﺮﻣﺠﺔ وﺗﻘﻮل أﻧﻨﺎ ﻓﻲ اﻟﺒﺮﻣﺠﺔ
اﻟﻤﮭﯿﻜﻠﺔ ﻧﺴﺘﻄﯿﻊ أن ﻧﺨﻔﻲ وﻧﻐﻠﻒ اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﺪاﻟﺔ ﺑﺠﻌﻠﮭﺎ ﺧﺎﺻﺔ privateﺑﮭﺬه اﻟﺪاﻟﺔ ﻓﻘﻂ
وﻣﻌﻚ ﺣﻖ ﻓﻲ ذﻟﻚ وﻟﻜﻦ ﻣﺎذا ﻟﻮ أردﻧﺎ ﺟﻌﻞ ھﺬه اﻟﺒﯿﺎﻧﺎت Globalوھﺬا ﺻﺤﯿﺢ وﻟﻜﻦ ﻣﺎ اﻟﺤﻞ
إذا أردﻧﺎ ﺟﻌﻞ ﺗﻠﻚ اﻟﺒﯿﺎﻧﺎت ﻣﺘﺎﺣﺔ ﻟﺒﻌﺾ اﻟﺪوال وﻏﯿﺮ ﻣﺘﺎﺣﺔ ﻟﻸﺧﺮى واﻟﺤﻞ أن ﯾﻜﻮن ﻋﻨﺪﻧﺎ
Multiple Scopeوھﺬا ﻣﺎ ﺗﺆدﯾﮫ ﻟﻨﺎ ﻋﻤﻠﯿﺔ Encapsulationﻓﻤﻦ ﺧﻼل اﻟﻔﺼﻠﯿ ﺔ اﺳﺘﻄﯿﻊ
أن اﺟﻌﻞ اﻟﺒﯿﺎﻧﺎت Globalﻟﻠﺪوال اﻟﺘﻲ أرﯾﺪ أن ﺗﺘﻮﺻﻞ Accessﻟﮭﺬه اﻟﺒﯿﺎﻧﺎت ﺑﺎن أﺿﻌﮭﻢ
ﺳﻮﯾﺎ ﻓﻲ ﻓﺼﯿﻠﺔ واﺣﺪة .
ﻟﻘﺪ ﺧﻠﻖ اﻟﻤﺒﺪع واﻷول واﻵﺧﺮ ﺳﺒﺤﺎﻧﮫ ال classاﻹﻧﺴﺎن وﺟﻌﻞ ﻟﮫ ﺻﻔﺎت ) = members
(variablesﻣﻦ ﻋﯿﻨﯿﻦ وأﻧﻒ وأذن و ﻗﻠﺐ و اﻟﻜﺜﯿﺮ ﻣﻦ اﻟﺼﻔﺎت اﻷﺧﺮى وﻗﺪ ﺟﻌﻞ اﷲ ھﺬه
اﻟﺼﻔﺎت ﻣﻦ اﻟﻤﻤﻜﻦ أن ﻧﺼﻞ ﻟﮭﺎ وﻧﻤﺴﻜﮭﺎ ﻓﻨﺴﺘﻄﯿﻊ أن ﻧﻤﺴﻚ أﻋﯿﻨﻨﺎ و ھﻨﺎك اﻟﻄﺒﯿﺐ اﻟﺠﺮاح
اﻟﺬي ﯾﻤﺴﻚ اﻟﻘﻠﺐ ﺑﯿﺪﯾﮫ ﻓﮭﺬه اﻟﺼﻔﺎت ﯾﺴﺘﻄﯿﻊ أن ﯾﺼﻞ ﻟﮭﺎ أي ﺷﻲء ﻓﮭﻲ ﻋﺎﻣﺔ )، (public
وﺧﻠﻖ اﷲ أﯾﻀﺎً ﺻﻔﺎت ) (membersﻓﻲ اﻹﻧﺴﺎن ﻣﺜﻞ اﻟﺮوح وﻟﻜﻨﻨﺎ ﻻ ﻧﺴﺘﻄﯿﻊ أن ﻧﺼﻞ ﻟﮭﺎ
و ﻧﻤﺴﻚ ﺑﮭﺎ .ﯾﻘﻮل ﺗﻌﺈﻟﻰ ) و ﯾﺴﺄﻟﻮﻧﻚ ﻋﻦ اﻟﺮوح ﻗﻞ اﻟﺮوح ﻣﻦ أﻣﺮ رﺑﻲ( ﻓﮭﻲ ﺻﻔﺎت ﺧﺎﺻﺔ
) (privateﻣﻤﻨﻮع أن ﺗﺼﻞ ﻟﮭﺎ أي ) (classأﺧﺮى .و ﺗﺨﯿﻞ ﻟﻮ ﻛﺎﻧﺖ اﻟﺮوح ﻣﻦ اﻟﻤﻤﻜﻦ أن
ﻧﺼﻞ ﻟﮭﺎ وﻧﻤﺴﻜﮭﺎ ﻣﺜﻞ اﻟﻌﯿﻦ ﻓﻜﻤﺎ إﻧﮫ ھﻨﺎك ﻣﻦ ﺗﻤﺮض ﻋﯿ ﻨﮫ ﻓﯿﻘﻮم ﺑﻨﻘﻞ ﻋﯿﻦ إﻧﺴﺎن آﺧﺮ ﻓﻠﻮ
ﻛﺎﻧﺖ اﻟﺮوح ﻣﻦ اﻟﻤﻤﻜﻦ أن ﻧﺼﻞ ﻟﮭﺎ ) (publicﻟﻮﺟﺪﻧﺎ ﻣﻦ ﻻ ﺗﻌﺠﺒﮫ روﺣﮫ ﻓﯿﻨﻘﻞ وﯾﺴﺘﺒﺪل
روح إﻧﺴﺎن آﺧﺮ ! إذن ﻓﮭﻨﺎك ) (membersﻓﻲ ال classﺗﻜﻮن publicوأﺧﺮى
privateﻻ ﺗﺴﺘﻄﯿﻊ classأﺧﺮى أن ﺗﺼﻞ ﻟﮭﺎ ﻣﺒﺎﺷﺮة.
وﻟﻜﻦ ﻗﺪ ﯾﻘﻮم ﺻﺎﻧﻊ ال classﺑﻌﻤ ﻞ methodsﺗﺆﺛﺮ ﻓﻲ ھﺬه ال private members
ودون أن ﺗﺼﻞ ﻟﮭﺎ .ﻓﻤﺜﻼ ﺟﻌﻞ اﷲ اﻟﺨﺎﻟﻖ اﻟﻌﻈﯿﻢ methodsﻓﻲ اﻹﻧﺴﺎن ﯾﺴﺘﻄﯿﻊ ﺑﮭﺎ أن
ﯾﺆﺛﺮ ﻓﻲ اﻟﺮوح وﻣﻦ ھﺬه ال methodsﯾﺼﻠﻲ و ﯾﺰﻛﻲ وﯾﺼﻮم .
وﺧﻠﻖ اﻟﺨﺎﻟﻖ ﺳﺒﺤﺎﻧﮫ وﺗﻌﺈﻟﻰ أﯾﻀﺎ ﺟﯿﻨﺎت ﻧﻤﺘﻠﻜﮭﺎ ﻣﻦ أﺑﻮﯾﻨﺎ وﻻ ﯾﺴﺘﻄﯿﻊ ﻓﺮد ﺧﺎرج اﻟﻌﺎﺋﻠﺔ أن
ﯾﻤﺘﻠﻜﮭﺎ أو أن ﯾﺤﺼﻞ ﻋﻠﯿﮭﺎ ﻣﺜﻞ اﻟﻨﺨﺎع ...
ﻓﻲ Javaﯾﺴﺘﻄﯿﻊ ال class creatorأن ﯾﺤﺪد ﻗﻮاﻋﺪ اﻟﻮﺻﻮل ) (access controlﻟﻞ
membersﻓﻲ ال classﻣﻦ variablesو .methodsھﺬه access controlھﻲ
public) :و privateو protectedو . (default
9-2 ﺟﺪول
ﻣﻜﺎن اﻟﻮﺻﻮل public default Protected Private
وﻣﻄﻠﻮب ﻣﻨﻚ ﺗﻨﻔﯿﺬ اﻟﻜﻮد دون اﻟﻤﺴﺎسprivate ھﺬا اﻟﻤﺜﺎل ﺗﻮﺟﺪ ﺑﮫ داﻟﮫ ﺑﻨﺎء ﻣﻦ ﻧﻮع ﻣﺤﻤﻲ
ﺑﻤﺤﺪدات اﻟﻮﺻﻮل ﻓﻜﯿﻒ ﺳﺘﻌﺎﻟﺞ ھﺬه اﻟﻤﺸﻜﻠﺔ ؟
:ﺣﻞ اﻟﻤﺜﺎل
ﻟﺪﯾﻚ ﻃﺮﯾﻘﺘﯿﻦ
ﺗﻌﯿﺪ ﻟﻨﺎ ﻗﯿﻤﺔ ﻣﻦ ﻧﻮع داﻟﺔ اﻟﺒﻨﺎء اﻟﻤﺤﻤﯿﺔ static أن ﻧﺼﻨﻊ داﻟﺔ ﻣﻦ ﻧﻮع:اﻷوﻟﻰ
: ﻣﻦ ھﺬا اﻟﻤﺜﺎل4 ﻛﺎﻟﺴﻄﺮ رﻗﻢ
1. // Chp9_23 ﺣﻞ ﺑﺮﻧﺎﻣﺞ
2. class Chp9__24 {
3. private Chp9__24() { System.out.println("Start");}
4. static Chp9__24 dop(){return new Chp9__24();}
5. }
6.
7. class Chp9_24 {
8. public static void main(String[] args) {
9. Chp9__24 p = Chp9__24.dop();
10. System.out.println("End");
11. }
12. }
.9 اﺳﻢ اﻟﺪاﻟﺔ اﻻﺻﻄﻨﺎﻋﯿﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ.Class وﻋﻨﺪ إﻧﺸﺎء اﻟﮭﺪف ﻧﺬﻛﺮ اﺳﻢ
ﺛﻢ ﻋﻨﺪ إﻧﺸﺎء اﻟﻔﺌﺔ ﻧﺠﻌﻠﮭﺎ ﺗﺴﺎوي nullﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .9ﻓﺒﮭﺬا اﻟﺸﻜﻞ ﻟﻦ ﯾﺘﻢ ﺗﻨﻔﯿﺬ داﻟﺔ ا ﻟﺒﻨﺎء
إﻃﻼﻗﺎ.
ﺛﻢ ﻧﺬﻛﺮ اﺳﻢ اﻟﻔﺌﺔ .اﺳﻢ اﻟﺪاﻟﺔ اﻻﺻﻄﻨﺎﻋﯿﺔ ،ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ .10
ﻓﺎﻟﺴﺆال ھﻨﺎ أﯾﮭﻤﺎ أﻓﻀﻞ اﻟﻤﺜﺎل Chp9_24أم اﻟﻤﺜﺎل Chp9_25وﻟﻤﺎذا ؟
:ﺷﺮح اﻟﻤﺜﺎل
.print() ﺗﺸﯿﺮ إﻟﻰ اﻟﺒﺎراﻣﺘﺮ اﻟﺪاﺧﻞ ﻟﻠﺪاﻟﺔ4 ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺴﻄﺮ
.3 ( ﺗﺸﯿﺮ إﻟﻰ اﻟﻤﺘﺤﻮل اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺴﻄﺮ5,9) ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺴﻄﺮ
.8 ﺗﺸﯿﺮ إﻟﻰ اﻟﻤﺘﺤﻮل اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺴﻄﺮ10 ﺟﻤﻠﺔ اﻟﻄﺒﺎﻋﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺴﻄﺮ
ﺻﺪﯾﻘﻲ اﻟﻘﺎرئ إﻻ أن ﺗﺮﻛﺰ ﻓﻲ ھﺬا اﻟﻜﻮد أم اﻵن وﺑﻌﺪ أن ﺗﻌﻠﻤﻨﺎ اﻷﺳﺎﺳﯿﺎت ﻓﻤﺎ ﻋﻠﯿﻚ اﻵن
!ﻓﮭﻮ ﻣﮭﻢ ﺟﺪا
1. // ﻣﺜﺎل ﺗﻄﺒﯿﻘﻲ
2. class Bowl {
3. Bowl(int marker) { System.out.println("Bowl(" + marker + ")"); }
4. void f(int marker) { System.out.println("f(" + marker + ")"); }
5. }
6. class Table {
7. static Bowl b1 = new Bowl(1);
8. Table() { System.out.println("Table()"); b2.f(1);
9. }
10. void f2(int marker) { System.out.println("f2(" + marker + ")"); }
11. static Bowl b2 = new Bowl(2);
12. }
13. class Cupboard {
14. Bowl b3 = new Bowl(3);
15. static Bowl b4 = new Bowl(4);
16. Cupboard() { System.out.println("Cupboard()"); b4.f(2); }
17. void f3(int marker) { System.out.println("f3(" + marker + ")");}
18. static Bowl b5 = new Bowl(5);
19. }
20. public class Chp9_27 {
ﺷﺮح اﻟﻤﺜﺎل:
ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻞ اﻻﺳﺘﺎﺗﯿﻜﯿﺔ ﻓﻲ اﻟﺪاﻟﺔ اﻟﺮﺋﯿﺴﻲ ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ ).(29,30 (1
ﺑﺪاﺧﻞ ﻛﻞ Classﻛﺘـﻞ اﺳﺘﺎﺗﯿﻜﻲ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬه أوﻻً ﻛﻤﺎ ﻓﻲ اﻷﺳﻄﺮ ) (7,11,15,18ﺛﻢ (2
اﻟﺠﻤﻞ اﻟﻐﯿﺮ اﺳﺘﺎﺗﯿﻜﯿﺔ ﻣﺜﻞ ﺟﻤﻞ إﻧﺸﺎء اﻟﻔﺌﺎت ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ . 14
ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ دوال اﻟﺒﻨﺎء داﺧﻞ ﻛـﻞ . Class (3
أن ﻋﺎود اﺳﺘﺪﻋﺎء Classﻣﺮة أﺧﺮى ﻓﺄﻧﺔ ﻻ ﯾﻨﻔﺬ اﻟﻜﺘﻞ اﻻﺳﺘﺎﺗﯿﻜﯿﺔ ﺑﻞ ﯾﻨﻔﺬ (4
(1اﻟﻜﺘﻞ اﻟﻌﺎدﯾﺔ .
(2دوال اﻟﺒﻨﺎء .
ﻣﻦ اﻟﻤﻤﻜﻦ اﻟﺼﻨﻒ اﻟﺪاﺧﻠﻲ اﻟﺤﺼﻮل ﻋﻠﻰ ﻣﺮﺟﻊ اﻟﺒﯿﺎﻧﺎت واﻟﻤﻨﺎھﺞ اﻟﻤﻮﺟﻮدة ﻓﻲ
اﻟﺼﻨﻒ اﻟﺨﺎرﺟﻲ اﻟﺬي ﯾﻌﺸﺶ ﻓﯿﮫ .ﻟﺬﻟﻚ ﻻ ﺗﺤﺘﺎج إﻟﻰ ﺗﻤﺮﯾﺮ ﻣﺮﺟﻊ ﻟﻠﺼﻨﻒ اﻟﺨﺎرﺟﻲ
ﺿﻤﻦ ﺑﺎﻧﻲ اﻟﺼﻨﻒ اﻟﺪاﺧﻠﻲ .ﻛﺎﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ:
ﺣﺼﻮل اﻟﻜﻼس اﻟﺪاﺧﻠﻲ ﻋﻠﻰ ﻗﯿﻢ ﻣﺘﺤﻮﻻت اﻟﻜﻼس اﻟﺨﺎرﺟﻲ 1. //
;2. class Chp9__29{static int i=20
3. };)"Chp9__29(){System.out.println("Star Chp9__29
4.
5. ;static class Chp9___29{static int i=40
6. ;Chp9___29(){int i=50
7. ;)System.out.println(i+" "+this.i
8. ;)System.out.println(Chp9___29.i+" "+Chp9__29.i
ﻣﻦ اﻟﻤﻤﻜﻦ اﻟﺘﺼﺮﯾﺢ ﻋﻦ اﻟﺼﻨﻒ اﻟﺪاﺧﻠﻲ ﻋﻠﻰ أﻧﮫ ) public , private ,
(protectedﺣﯿﺚ ﯾﺨﻀﻊ ﻟﻨﻔﺲ ﻗﻮاﻋﺪ اﻟﺮؤﯾﺔ اﻟﻤﻄﺒﻘﺔ ﻋﻠﻰ ﻋﻨﺎﺻﺮ اﻟﺼﻨﻒ.
ﻟﻤﻤﻜﻦ اﻟﺘﺼﺮﯾﺢ ﻋﻠﻰ ﻋﻨﺎﺻﺮ اﻟﺼﻨﻒ اﻟﺪاﺧﻠﻲ ﻋﻠﻰ أﻧﮫ staticﺣﯿﺚ ﻣﻦ ﻣﻦ ا
اﻟﻤﻤﻜﻦ اﻟﻮﺻﻮل إﻟﻰ اﻟﺼﻨﻒ اﻻﺳﺘﺎﺗﯿﻜﻲ ﺑ ﺎﺳﺘﺨﺪام اﻟﺼﻨﻒ اﻟﺨﺎرﺟﻲ .ﻓﺴﺘﺨﺪم اﻟﺼﯿﻐﺔ
اﻟﺘﺎﻟﯿﺔ:
;)(Otherclass.innerclass innerobject =new Otherclass.innerclass
ﺑﺤﯿﺚ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻤﺘﻐﯿﺮات اﻟﺘﺎﻟﯿﺔ: أﻧﺸﺊ ﻓﺌﺔ ﺗﻤﺜﻞ ﻣﺮﺑﻊ وﺳﻤﮫ ، Rectengle .6
width ،lengthﯾﺄﺧﺬ ﻛﻞ واﺣﺪ ﻣﻨﮭﻢ ﻗﯿﻤﺔ اﺑﺘﺪاﺋﯿﺔ ﺗﺴﺎوي ،1وﯾﺤ ﺘﻮي ﻋﻠﻰ ﻣﻨﮭﺠﯿﻦ ،
ﯾﻘﻮم اﻟﻤﻨﮭﺞ اﻷول ﺑﺤﺴﺎب ﻣﺴﺎﺣﺔ اﻟﻤﺮﺑﻊ ،ﺑﯿﻨﻤﺎ ﯾﻘﻮم اﻟﻤﻨﮭﺞ اﻟﺜﺎﻧﻲ ﺑﺤﺴﺎب ﻣﺤﯿﻂ اﻟﻤﺮﺑﻊ.
ﺛﻢ أﻛﺘﺐ ﺑﺮﻧﺎﻣﺞ ﻟﺘﻄﺒﯿﻖ ھﺬه اﻟﻔﺌﮫ.