
הטקסט המלא של הדקות הראשונות בהרצאה «Function Overloading» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
האם אנחנו יכולים לבנות מספר פונקציות עם אותו השם? בואו נראה האם הדבר הזה אפשרי. בואו נניח שיש לנו כאן איזושהי פונקציה, נניח נקרא לה print, ואנחנו מציגים כאן printing some message.
ואנחנו רוצים עכשיו עוד פונקציה שנקראת print. כמובן שיש לנו על זה שגיאה. הסיבה היא כזאת, אם אנחנו קוראים לפונקציה שתיהן נראות בדיוק אותו הדבר מבחינת שם וחתימה ופרמטרים וכדומה, אז Java לא יודעת לאיזה פונקציה לקפוץ, יש לנו פה שתי פונקציות.
כמובן שעם שמות שונים אין שום בעיה, אבל מה קורה אם פונקציה אחת מקבלת פרמטר? לדוגמה int a, printing some message ובואו נדפיס פה כמה זה a.
עכשיו פתאום אנחנו רואים שאין שום בעיה, ולמעשה זאת טכניקה מאוד ידועה בהרבה שפות תכנות, והיא נקראת function overloading בעברית העמסת פונקציות.
העמסת פונקציות זה מצב שבו אנחנו רוצים לכתוב מספר פונקציות שעושות את אותו הדבר ולכן אנחנו כן רוצים לתת להם את אותו השם אבל כל אחת מקבלת מספר אחר של פרמטרים או סוג אחר של פרמטרים.
בואו ניקח עוד פונקציה וניקח הפעם string a אנחנו רואים שפתאום אין לנו שגיאה לדבר הזה. כאשר אנחנו קוראים לפונקציה בצורה כזאת, אז למעשה הפונקציה שמתבצעת זאת הפונקציה הראשונה, מפני שג'אווה רואה שיש לנו פה קפיצה לפונקציה ללא פרמטרים, שום בעיה, קופצת אליה.
ברגע שאנחנו רוצים לשלוח פרמטר מספרי, אוטומטית ג'אווה יודעת שאנחנו רוצים לקפוץ לפונקציה הזאת. ואם אנחנו שולחים פרמטר מכרוזתי, ג'אווה יודעת שאנחנו רוצים לקפוץ לפונקציה הזאת.
בואו נריץ את זה, והנה יש לנו עכשיו קפיצה לכל אחת משלושת הפונקציות. נעשה פה איזשהו הבדל printing some message 1, זה יהיה 2 וזה יהיה 3. נריץ שוב ונראה באמת שכל אחת מהפונקציות מתבצעת לפי הפרמטר ששלחנו.
כאן ביצענו את ההפרדה של הפונקציות על פי סוג הפרמטר, כאן ביצענו את ההפרדה של הפונקציות על פי מספר הפרמטרים.
אם אנחנו ניקח ונבצע שוב פעם printing some message 4 אבל נשלח a ו-b גם זה חוקי לגמרי בואו נדפיס פה רק את b ויאפשר לנו לבצע שוב פעם העמסה לפי מספר הפרמטרים בואו נשלח print ונשלח 10 ו-20 ואז המערכת תקפוץ לפונקציה הרביעית הנה אנחנו רואים את זה כאן אז יש לנו אפשרות לכתוב פונקציות עם אותו השם אבל עם מספר שונה של פרמטרים ו/או סוג שונה של פרמטרים.
האם אנחנו יכולים לעשות את ההפרדה הזאת על פי הערך המוחזר של הפונקציה? בואו ניקח את הפונקציה הזאת. יש לנו פה פונקציה שמקבלת String a ופונקציה שמקבלת Int a. אוקיי, בואו ניקח עוד פונקציה שגם תקבל Int, כמובן אנחנו רואים פה שגיאה, אבל לא נחזיר void אלא נחזיר, בואו נניח, ריטרן 1.2 אז אנחנו רואים שהמערכת לא מסכימה לקבל את ההעמסה הזאת ולמעשה זאת לא העמסה
בכלל זאת לא function overloading מפני שאי אפשר לבצע הפרדה כזאת ההעמסה בין פונקציות על ידי שוני בערך המוחזר רק סוג הפרמטרים או מספר הפרמטרים או תשלובת ביניהם למה אי אפשר לעשות את זה?
אתם יכולים להגיד רגע אבל המערכת יכולה לדעת בעצם