העמסת constructor (בנאים)
-
בהמשך לתכנה לגבאים שאני מנסה לכתוב..
במחלקת המתפללים יש לי כמה פרמטרים: שם פרטי, משפחה, שם האבא, שם האמא, תאריך לידה, תאריך יארצייט, נשוי/רווק וכדו'.
שאלתי היא: האם אפשר להגדיר בנאי אחד שמקבל את כל הפרמטרים, ואח"כ במימוש להזין לו רק חלק (לא תמיד כשארצה להזין מתפלל חדש, אדע את כל הנתונים, או שחלקם לא רלוונטיים לגביו). או שבשביל זה צריך להעמיס בנאים, ולהגדיר בנאים נוספים שמקבלים רק חלק מהפרמטרים.
אם כן, מה קורה אם הפעלתי בנאי שמקבל חלק מהפרמטרים, ואח"כ אני רוצה להוסיף למתפלל הזה עוד נתונים? האם יש לי יכולת ע"י פונקציות set להזין לו את הערכים הללו (כמובן הגדרתי properties), או שכיון שמלכתחילה לא בניתי אותו עם הנתונים הללו - אז אין לי יכולת להוסיף אותם??
חפרתי.. אז בתמצית: האם מספיק להגדיר בנאי אחד, ולהזין לו לחלק מהערכים 0 ואח"כ לעדכן אותם, או שבשביל כך מגדירים כמה בנאים ואח"כ מעדכנים אותם?
תודה רבה!
אברהםפורסם במקור בפורום CODE613 ב19/05/2015 20:01 (+03:00)
-
השאלות שלך דבש!
א. בשביל להגדיר מאפייני מחלקה אין צורך בכלל לקבוע בנאי שעושה את העבודה הזאת (X=x' Y=y...). ובכלל בנאי הוא לא חובה כלל (למעשה כשאין בנאי הקומפיילר יוצר אחד בעצמו ללא פרמטרים).
קביעת מאפיינים נעשית דרך שם המחלקה נוקדה שם המאפיין והשמה:var obj = new MyClass(); obj.SomeProperty = "some value";
לנוחות קביעת המאפיינים עם בניית המחלקה אפשר להשתמש בתחביר Object Initializer, ככה:
var obj = new MyClass { SomeProperty = "some value", anotherProperty = "123" };
ב. בדרך כלל משתמשים בבנאי בשביל לקבוע "התקנה" של המחלקה שלנו. כלומר דברים שנחוץ לעשות מייד ביצירת המחלקה, בשביל זה עושים בנאי. לפעמים העבודה הזאת דורשת פרמטרים. למשל כשיוצרים מחלקה מסוג FileInfo יש בנאי שמקבל טקסט שמייצג את השם המלא של הקובץ.
במחלקות מסוג struct חובה לאתחל את המאפיינים בבנאי ולכן יש מחלקות שמקבלים כפרמטרים ערכים למאפיינים שלהם, והם לא נסמכים על הObject Initalizer או על Set של המאפיינים.ג. אפשר להגדיר בנאי אחד עם הרבה פרמטרים, ולאפשר הזנה חלקית שלהם (זה למעשה מאפיין כל מתודה לא רק בנאי). זו תכונה ששמה Optional Argument. פשוט מזינים אחרי הפרמטר סימן שווה וערך ככה:
public MyClass(int property1, int property2 = 50) { ... }
הפרמטר הראשון הוא חובה, השני ניתן להשמטה ואז הערך המתקבל לבנאי הוא 50. בערכים שמקבלים null אפשר כמובן להשתמש בnull בהשמה.
כעת מה אם רוצים לשים חלק מפרמטרים אופציונליים? כאשר אלה שמשמיטים הם אחרונים בסדר הפרמטרים אין שום בעיה, אבל אם אני ורצה להציב ערך בפמרטר הראשון והשלישי אז משתמשים בתכונת Named Argumnts, שזה אופציה לא לשייך את הפרמטרים "לפי מיקום" אלא לפי שם:
נניח זה הבנאי:public MyClass(int property1 = 20, int property2 = 50, string property3 = "default value") { ... }
כל הפרמטרים אופציונליים ואפשר להשמיט את כולם. כמו"כ אם רוצים להציב רק בראשון/ראשון+שני, פשוט כותבים רק פרמטר/שתיים. אך מה אם רוצים את הראשון והשלישי? כותבים ככה:
var obj = new MyClass(25, property3: "MyValueForProperty3");
הפרמטר הראשון מזוהה לפי מיקומו ונשלח לproperty1. אבל השני שיש לו תוית עם נקודתיים מזוהה לפי שמו, ומועבר לפרמטר השלישי.
שוב, במקרה הקלאסי של הגדרת מאפיינים, אל תשתמש בכלל בבנאי.
פורסם במקור בפורום CODE613 ב20/05/2015 13:06 (+03:00)