Clone לרשימה מקושרת - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

Clone לרשימה מקושרת


Statement

Recommended Posts

אין קשר ל-casting.

אני מניח שכוונת המשורר הייתה לעבור חוליה חוליה ברשימה ולהעתיק אותו ולא להעתיק את ה-instance של הרשימה.

את האמת לא הבנתי מה התכוונת, אני רק רוצה לדעת דבר אחד, איך אני יכול לעשות Clone לData, אני התבקשתי לעשות שכפול עמוק ככל האפשר, אני יכול לשכפל ListNode אבל אז הData של הListNode החדש יצביע על הData של הListNode הישן...

מה אני אמור לעשות? תוכל רק לומר לי באיזו צורה אני אמור לשכפל את הData? או באיזה צורה לדעתך אני צריך לפעול בכדי לשכפל הכי עמוק שאפשר?

תודה רבה

אילי

קישור לתוכן
שתף באתרים אחרים

אם ה-Data אינו בר שכפול אז אי אפשר לשכפל אותו - אין מה לעשות. הדבר הטוב ביותר שתוכל לעשות הוא להעתיק את הרפרנס אליו וזהו.

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

קישור לתוכן
שתף באתרים אחרים

אם ה-Data אינו בר שכפול אז אי אפשר לשכפל אותו - אין מה לעשות. הדבר הטוב ביותר שתוכל לעשות הוא להעתיק את הרפרנס אליו וזהו.

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

או, אוקיי, אז ניסיתי את זה, אבל אחרי שאני עושה את הבדיקה זה משאיר לי את השגיאה

f(data instanceof Cloneable){            return data.clone();
}

אותה שגיאה ממקודם...

זאת הכוונה שלך (בצורה בסיסית)?

קישור לתוכן
שתף באתרים אחרים

א. לא מספיק לבדוק את הטיפוס, אתה צריך לעשות גם casting.

ב. הפונקציה שלך לא "שלמה" - אתה צריך שיהיה לך return בכל המקרים, גם התנאי ב-if הוא שקר.

אוקיי נכון, גם אני חשבתי שצריך להיות Casting פשוט כמה הודעות למעלה אמרו לי שזה לא קשור, למה לעשות casting, לClonable?

ניסיתי לעשות casting לcloneable וזה נותן לי באותו המקום את השגיאה הזאת

"The method clone() is undefined for the type Cloneable."

זה מה שאתה מתכוון (עדיין בכיוון כללי)

        if(data instanceof Cloneable){              
Cloneable a=(Cloneable)data;
return a.clone();
}
else throw new CloneNotSupportedException();
}
}

תודה רבה רבה על העזרה

קישור לתוכן
שתף באתרים אחרים

אכן אתה צודק. הממשק Cloneable לא באמת מגדיר פונקציה בשם clone אלא מסתמך על קיומה של הפונקציה Object.clone שהיא protected (בעמוד הקודם Gil28 נתן לינק למאמר שמסביר איך אמורים לממש אותה). מה שזה אומר הוא שאלא אם המחלקה מימשה את הפונקציה clone, הפכה אותה ל-public, ויש לך ביד את הטיפוס הקונקרטי שלה (כלומר לא מספיק לבדוק שהיא Cloneable, אתה חייב לדעת את הטיפוס האמיתי שלה) אז אין דרך להשתמש ב-clone, אלא אם אתה רוצה להשתמש ב-reflection ולעקוף את מנגנוני ההגנה האלה (מה שלא מומלץ).

קישור לתוכן
שתף באתרים אחרים

אכן אתה צודק. הממשק Cloneable לא באמת מגדיר פונקציה בשם clone אלא מסתמך על קיומה של הפונקציה Object.clone שהיא protected (בעמוד הקודם Gil28 נתן לינק למאמר שמסביר איך אמורים לממש אותה). מה שזה אומר הוא שאלא אם המחלקה מימשה את הפונקציה clone, הפכה אותה ל-public, ויש לך ביד את הטיפוס הקונקרטי שלה (כלומר לא מספיק לבדוק שהיא Cloneable, אתה חייב לדעת את הטיפוס האמיתי שלה) אז אין דרך להשתמש ב-clone, אלא אם אתה רוצה להשתמש ב-reflection ולעקוף את מנגנוני ההגנה האלה (מה שלא מומלץ).

אוקיי, אז באיזה צורה אני מגיע לClone של Data?

למה לעשות את הCasting? יש לי אופציה למממש את הדרך שאמרתי שאני רוצה לפתור את התרגיל? אני רוצה באמת להשקיע ולעשות את הclone הכי עמוק שאני יכול...

איך אני מגיע לזה שיש לו את השיטה? לעשות getClass().getMethods()?

אני יעשה מה שתגיד לי, הבעיה שלי היא לעשות Clone לData...

באמת תודה רבה על העזרה של כולכם עד עכשיו

קישור לתוכן
שתף באתרים אחרים

ה-Casting הוא חסר משמעות - Cloneable לא מגדירה שום פונקציות, בפרט לא את clone (למשתנה מטיפוס Cloneable ולמשתנה מטיפוס Object יש את אותן פונקציות). כן, אתה יכול להגיע לשיטה clone באמצעות getClass().getMethods וכו' (זה מה שהתכוונתי ב-reflection) אבל כאמור זה פתרון לא הכי מומלץ, ואני בספק אם זה מה שהתכוונו אליו כותבי התרגיל.

קישור לתוכן
שתף באתרים אחרים

ה-Casting הוא חסר משמעות - Cloneable לא מגדירה שום פונקציות, בפרט לא את clone (למשתנה מטיפוס Cloneable ולמשתנה מטיפוס Object יש את אותן פונקציות). כן, אתה יכול להגיע לשיטה clone באמצעות getClass().getMethods וכו' (זה מה שהתכוונתי ב-reflection) אבל כאמור זה פתרון לא הכי מומלץ, ואני בספק אם זה מה שהתכוונו אליו כותבי התרגיל.

אז, אנחנו לא מגיעים לעיקר כל כך, באיזה דרך אני יכול להגיע לפתרון, אני צריך או בכלל יצליח לעשות Clone לData? אני הבנתי מההתכתבות ביננו שלא, ואז חשבתי אם הData הוא מסוג של Point לדוגמא, ולPoint יש בתוכו Clone משלו, אני סתם טועה, אז אני כן צריך לעשות Clone לData? אני רק התבלבלתי...

אני התבקשתי בשאלה לעשות את הClone הכי עמוק שאני יכול, ואני גם חושב שReflection לא היה הכוונה, אז איך אני פותר את זה ? איך אני מגיע למצב שאני יכול לעשות Data.clone()?

**אני לא מבקש שתפתור לי, אני רק צריך כיוון איך לבצע את הפעולה של Clone לData...

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

תודה רבה

אילי

קישור לתוכן
שתף באתרים אחרים

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

כאמור - בלי reflection אין פתרון (דהיינו תצטרך להעתיק את הרפרנס ולא לעשות clone). אתה יכול לפנות למי שנתן לך את התרגיל ולשאול אותו למה הכוונה.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...