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

העתקה עמוקה ב C#


טוסטר

Recommended Posts

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

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

או שאני צריך לכתוב פונקציה שמעתיקה שדה שדה באופן ידני (מה שלא נשמע לי כ"כ הגיוני..)

תודה רבה :)

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

במשפט אחד: אתה צריך להגדיר Copy Constructor בעצמך.

הרעיון ב-#C (וברוב שפות התכנות שהן managed) הוא שאתה אף פעם לא מעביר אובייקטים, אלא רק מעביר התייחסויות אליהם. אם נקביל את זה ל-++C, זה אומר שכל המשתנים שלך הם מטיפוס מצביע.

אם לדוגמה MyClass היא מחלקה כלשהי, ואתה מגדיר MyClass x, אז לא הגדרת אובייקט מטיפוס MyClass, אלא רק הגדרת רפרנס לטיפוס MyClass. לכן, השמה ל-x רק מעתיקה את הרפרנס.

על מנת לשכפל אובייקט, יש שתי אפשרויות - או שהמחלקה תספק פונקציה מתאימה לכך (פונקציית Clone, שאם מגדירים אותה אז כבר עושים את הקלאס ICloneable) או להשתמש ב-Copy Constructor, ואז על מנת להעתיק את y ל-x עושים (x = new MyClass(y במקום סתם x=y.

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

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

ארכיון

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

×
  • צור חדש...