
new. ה-new מקצה מקום בזיכרון, ואז הבנאי מאתחל את המקום הזה. הבנאי עצמו לא מקצה זיכרון.new ישירות, אבל הבנאי שלה עדיין רץ כשיורש שלה נוצר. קודם רץ הבנאי של הבסיס, ורק אחר כך הבנאי של היורש.הטקסט המלא של הדקות הראשונות בהרצאה «פרויקט מעשי ב-#C - תוכנת צייר - חלק 26» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
טוב, אנחנו ממשיכים כרגע בלסדר את הקוד, אז דבר אחד נוסף שרצינו לעשות זה משהו שנקרא קונסטרקטור, וזה הדבר הבא. אז כאן אני בעצם מייצר לי את free end ופה את line, ופה אני נותן ל-s את width ואת color.
עכשיו למעשה, אחרי שאני נותן ל-free end ול-line את ה-width ואת ה-color שלהם, ובוא נגיד שכרגע אני לא מעוניין שניתן יהיה לשנות אחרי זה את הצבע שלהם.
זה משהו שלאובייקט יש קלר וצבע ולא ניתן לשנות אותם אחרי זה. ואני לא רוצה, בוא נגיד, בוודאי שלא מבחוץ, גישה לשנות אותם. זאת אומרת, אני לא רוצה שמחוץ לפריאנד אני אוכל לשנות את הצבע של פריאנד ומחוץ לליין שאני אוכל לשנות את הצבע, את העובי של ליין.
היכולת, בכלל, אני כרגע לא רוצה בכלל שניתן יהיה לשנות צבע או עובי. בקיצור, מה שאנחנו עכשיו הולכים לעשות זה להגדיר אובייקט ומיד לתת לו את הערכים. מה שאני רוצה לעשות זה דבר שכזה, אני רוצה ללכת לוויט ולהגיד שבעצם וויט הוא וויט אונלי.
לא ניתן לשנות את וויט. אחרי שהגדרתי אובייקט, לא ניתן לשנות אותו. אחרי שהגדרתי עובי, לא ניתן לשנות. אם אני אנסה את זה להריץ, כמובן שנקבל שגיאה, פה אנחנו מנסים לשנות.
מה שאני כן יכול לעשות זה את הדבר הבא. לפני האיפים אני אגדיר את FloatWe, S קל להם להשאיר כרגע פה כרגע, אני אגדיר את FloatWe וכשאני אצור לי את FreeHand אני אתן לו את We.
אם נחזור ל-FreeHand אז נראה שאין לנו פונקציה שנראית כמו שאנחנו מצפים. אנחנו מצפים שתהיה פונקציה שהיא כשר המחלקה. פריהנד. פונקציה שנקראת, שאין לנו פה פונקציה שנקראת פריהנד.
פונקציה שהיא כשר המחלקה זה נקרא קונסטרקטור. אז אנחנו נגדיר פה אינטרנל פריהנד והיא מסוגלת לקבל את אינד או את פלוט וויד את העובי.
ובעצם כאן אנחנו ניגש לבייס קלאס שלנו ונגיד לו שהעובי שלו שווה לעובי שקיבלנו. בואו נעשה את זה. יפה, אנחנו מקבלים הודעה שגיאה. שוב, לגבי ה-read only.
read only field cannot be assigned חוץ מאשר לקונסטרקטור או בעידחול שדה. כאן אנחנו לא ניגשים לקונסטרקטור של הבסיס. אנחנו צריכים לאתחל את wits בקונסטרקטור של הבסיס.
אז נוסיף פה גישה קונסטרקטור של הבסיס ופה אנחנו בטח אמורים להפעיל את הקונסטרקטור של שייפ וניתן לו פה את טוויט ולא כאן אולי נשים את הקונסטרקטור בסיס בשורה נפרדת שיותר ברור אם ננסה את זה להריץ עכשיו עדיין נקבל שגיאה כי הקונסטרקטור של הבסיס בואו נראה no overload for method shape takes one argument אין overload אין קונסטרקטור לשייפ אתם רואים בסוגריים בטורבונית את שייפ עם סוגריים
עיריקים אין קונסטרקטור לשייפ שמקבל את וויט, אז צריך להגדיר כזה. אז נעשה Go to Definition לבסיס, נלך מפה, Go to Definition לבסיס, ונגדיר גם כאן קונסטרקטור אינטרנל שייפ שמקבל את Floatוויט ואומר שוויט שווה לוויט, שומר את הערך של וויט.
עכשיו בקונסטרקטור זה הזמן היחידי שאני יכול לתת ערך למשתנה שהוא Read Only. רק בקונסטרקטור. קונסטרקטור זה איפה שבעצם אני מאכל את האובייקט שלי.
האובייקט שלי זה בעצם הדבר שאני עושה לו new. כשאני עושה new לשם של קלאס, אני בעצם מקצה אובייקט, או מה שנקרא גוזל אובייקט מסוג הקלאס.
אני יותר מופע מסוג פריאנט. s מיד יצביע אליו. new מקצה מקום בזיכרון, להגיד בגודל של פריהן ואז הפונקציה שמאתחלת את פריהן תופעל על המקום הזה בזיכרון וזאת פונקציה שמקבלת פרמטר וויט פונקציה שבטח מזאת היא הקונספרטור שמאתחלת את המקום בזיכרון שהקצה הניו הניו מקצה מקום בזיכרון הפונקציה פריהן תאתחל את המקום הזה בזיכרון היא תקבל
פרמטר וויט אז יפה פריהן קיבלה את וויט פריאנד רוצה עכשיו, מבחינתה, לאתחל את הבסיס שלה. כי ווי זה שדה שהוא רידוני, וחייבים לאתחל אותו בקונסטרקטור.
אז פריאנד עכשיו ניגשת לבסיס שלה, שזה הקונסטרקטור של שייט. כלומר, אמרנו שפריאנד, חלק מפריאנד זה שייט.
פריאנד עכשיו מאתחלת חלק מהצמא. כמו שפריאנד יכולה להיות מאותכלת עם פרמטר, וזה הגוף של הקונסטרקטור של פריאנד, פריאנד יכולה, עוד לפני שהקונסטרקטור שלה מופעל, עוד לפני שהיא מאבחרת את המקום בזיכרון שהוקצה עבור האובייקט free end, עבור מופע free end, ניתן קודם כל לאתחל את ה-base class, את ה-class בסיס, את זה שמרכיב חלק יותר עקרוני ממה
שאנחנו משחקים בו. אנחנו משחקים בו חלק, אבל זה החלק העקרוני יותר מאיתנו, זה הבסיס שלנו. אנחנו צריכים לאתחל שם את wits, וויטס הוא read-only בשייפ עצמה זה קונסטרקטור פשוט קונסטרקטור שמקבל פרמטרים ושומר את הערך כמו כל פונקציה מחליט
מה לעשות את וויטס ניתן לגשת ולתת לו ערך רק כיוון שהוא read-only רק מתוך קונסטרקטור ואם הוא לב שניתן להגדיר קונסטרקטור עבור מחלקה שהיא אבסטרקטית אין קשר בין העובדה שהיא אבסטרקטית ואני לא יכול לעשות ניו שייט לבין העובדה שניתן להפעיל את הקונסטרקטור של שייט.
פריאנד מפעילה את הקונסטרקטור של שייט. אף על פי שפריאנד לא מקצה ניו שייט, אנחנו מקצים ניו פריאנד, וכתוצאה מכך שאנחנו מקצים ניו פריאנד אז מוקצה אוטומטית חלק מפריאנד זה השייט, ופה אנחנו מאבחרים אותו.
כאן בניו הזה נוצר מספיק מקום גם לשייט וגם לתוספות שפריאנד מוסיף. הבאתי שפריאן לא מוסיף תוספות, פריאן לא מוסיף עוד שדות. האמת הוא כן, כן מוסיף. זו תוספת של פריאן, יפה.
אז הגדרנו כאן קונסטרקטור למרות שזו מחלקה אפסטרקטית, אני לא יכול לעשות ניו שייט אבל אני יכול שהקונסטרקטור יעבוד בדרכים עקיפות כמו כזו.