עבור לתוכן

האם אפשר ליצור מטודה שתלויה בבנאי?

Featured Replies

פורסם

נגיד יש לי 2 בנאים

במידה ובנאי 1 נקרא, המטודה x תעשה כך וכך

אחרת מטודה x תעשה משהו אחר

אפשרי?

פורסם

שים בקלאס שלך איבר שקובע איזה איזה פעולה המתודה צריכה לעשות, ובכל בנאי תשים בו את הערך המתאים.

כלומר, בבנאי 1 תעשה flag=1 ובבנאי 2 תעשה flag=2, ואז המתודה תפעל לפי flag.

(זו הדרך הכי פשוטה, אבל היא חורנית ולא בדיוק "נכונה" במובן של תכנות נכון)

פורסם
  • מחבר

שים בקלאס שלך איבר שקובע איזה איזה פעולה המתודה צריכה לעשות, ובכל בנאי תשים בו את הערך המתאים.

כלומר, בבנאי 1 תעשה flag=1 ובבנאי 2 תעשה flag=2, ואז המתודה תפעל לפי flag.

(זו הדרך הכי פשוטה, אבל היא חורנית ולא בדיוק "נכונה" במובן של תכנות נכון)

זה בהחלט פתרון, אבל רציתי לדעת האם יש משהו built in

אם לא ידוע לך כנראה שאין

אגב תודה :xyxthumbs:

פורסם

למה שיהיה משהו כזה built in? זה דבר מאוד פרטני.

יש כמובן כל מיני פתרונות אחרים, כמו שימוש במצביעים לפונקציה / ירושה / template, אבל אי אפשר לומר בכלליות איזה פתרון הוא הכי מתאים בלי לדעת עוד פרטים.

פורסם
  • מחבר

למה שיהיה משהו כזה built in? זה דבר מאוד פרטני.

יש כמובן כל מיני פתרונות אחרים, כמו שימוש במצביעים לפונקציה / ירושה / template, אבל אי אפשר לומר בכלליות איזה פתרון הוא הכי מתאים בלי לדעת עוד פרטים.

סתם אני אסביר, לדוגמא מימוש stack

ישנם 2 דרכים כלליות, מערך או רשימה מקושרת

במידה והגודל ידוע אפשר להשמש במערך, אם לא, ברשמה

עכשיו הפונקציות על 2 מבני הנתונים הללו שונות, לכן סתם רציתי לחשוב אם ניתן יהיה לבצע פונקציות שונות

כלומר, רציתי ליצור מחסנית שכוללת את 2 האפשרויות בו זמנית, המטרה לימודית לחלוטין דרך אגב

פורסם

הדבר הנכון היא להגדיר ממשק כללי למחסנית (נקרא לו לדוגמה IStack), שיגדיר את הפעולות המותרות על מחסנית, ולהגדיר שתי מחלקות נפרדות למחסנית - ListStack ו-ArrayStack - שכל אחת מהן מממשת את הממשק IStack, אבל באופן שונה.

בשביל לבחור באיזה מימוש להשתמש, אתה צריך factory - אובייקט שיש לו פונקציה יחידה, שמקבלת פרמטר שקובע באיזה מימוש של מחסנית להשתמש (וכמובן עוד פרמטרים אחרים הדרושים ליצירת המחסנית, אם יש כאלו) ומחזירה את המחסנית המתאימה כאובייקט IStack.

פורסם
  • מחבר

הדבר הנכון היא להגדיר ממשק כללי למחסנית (נקרא לו לדוגמה IStack), שיגדיר את הפעולות המותרות על מחסנית, ולהגדיר שתי מחלקות נפרדות למחסנית - ListStack ו-ArrayStack - שכל אחת מהן מממשת את הממשק IStack, אבל באופן שונה.

בשביל לבחור באיזה מימוש להשתמש, אתה צריך factory - אובייקט שיש לו פונקציה יחידה, שמקבלת פרמטר שקובע באיזה מימוש של מחסנית להשתמש (וכמובן עוד פרמטרים אחרים הדרושים ליצירת המחסנית, אם יש כאלו) ומחזירה את המחסנית המתאימה כאובייקט IStack.

כה פחות או יותר מה שתיארתי לעצמי

מחשבה יפה בכל אופן, כנראה שאין דרך אחרת

תודה שניצל!

פורסם

הקטע של factory זה שיטה מקובלת אך לא הכרחית. לפעמים עדיף פשוט לתת למשתמש לקרוא לבנאי הנכון של המחלקה שהוא רוצה: (כלומר לקרוא לבנאי ListStack או לבנאי ArrayStack ישירות), ולעבוד על האובייקט דרך הממשק המשותף (IStack).

להתנהגות קוראים פולימורפיזם, וזו הדרך הבסיסית והכי built-in בשפות מונחות עצמים להשיג את מה שאתה רוצה.

פורסם
  • מחבר

הקטע של factory זה שיטה מקובלת אך לא הכרחית. לפעמים עדיף פשוט לתת למשתמש לקרוא לבנאי הנכון של המחלקה שהוא רוצה: (כלומר לקרוא לבנאי ListStack או לבנאי ArrayStack ישירות), ולעבוד על האובייקט דרך הממשק המשותף (IStack).

להתנהגות קוראים פולימורפיזם, וזו הדרך הבסיסית והכי built-in בשפות מונחות עצמים להשיג את מה שאתה רוצה.

זה היה הפתרון הראשון שעלה לי בראש

אבל זה לא פתרון למה שחיפשתי

חיפשתי דרך בעצם לעשות זאת בצורה יותר פשטנית

המטרה הייתה לימוד, האם קיימת דרך לעשות זאת בקלאסס אחד, בלי אלמנט ה flag

עכשיו אני מביא כמובן שלא, תודה :xyxthumbs:

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים