שאלה בс#

svoivandim

New member
שאלה בс#

כאשר אני מכריז על משתנה פשוט נניח לדוגמא: int first=5; double second; פה למעשה יש הקצאת זכרון פשוטה של משתנה פשוט וזה ברור, אבל כאשר אני יוצר אובייקט או מכריז על אובייקט לדוגמא: person first=new person(); לא ברור לי התחביר של יצירת האובייקט,כלומר אני מכריז על אוביקט ששמו first מסוג המחלקה person ,עד פה הכל ברור אז מה זה ה new person() הזה,כלומר למה פעם שנייה לכתוב את סוג שם המחלקה בצירוף המילה new? זה מבלבל אותי,אם תוכלו להבהיר לי את הנקודה הזאת ,אודה לכם!! תודה מראש!!
 

גרי רשף

New member
בואו נראה אם אני הבנתי

אינני בטוח שאני מבין, ואם ההסבר שלי שגוי- אשמח להתעדכן.. הפקודה int i מכריזה על משתנה אך עדיין אינה מאתחלת אותו, וזה לעומת הפקודה int i=0 שגם מכריזה וגם מאתחלת. במקרה של person - האתחול אינו משהו "פשוט" אלא סדרה של פעולות שמוגדרות ב-constructor של ה-class כי כעקרון אין מדובר כאן בפעולה כמו
person first = "yosi"​
אלא בפעולה מורכבת יותר. עדיין נשאלת השאלה מדוע כותבים person first= new person וחוזרים פעמיים על המילה person.. וכי יש אפשרות אחרת?
 

yuval k

New member
יש אפשרות אחרת...

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

svoivandim

New member
משאתה אומר למעשה זה

ש 1:
int first=5;​
זה שווה ערך לפעולת הnew שבהכרזת האובייקט? כלומר שלפעולת הnew שבהכרזת האובייקט זה כמו השמת משתנה פשוט בערך מסויים? האם כך הדבר?,האם הבנתי נכון? 2: "יכול להיות מקרה שמשתנה מסוג מסויים מאותחל כמופע של מחלקה שיורשת ממנו, למשל, וזוהי המהות של פולימורפיזם" הבנתי את המשפט הזה,אבל זה עושה לי סלט בראש,מכיוון שאם יש משתנה מסוג מסויים שמאותחל כמופע של מחלקה שיורשת ממנו,אז לאיזה סוג של משתנה הוא יהפוך להיות?, זה מבלבל אותי,וכבר ניסו להסביר לי את זה על ידי דוגמאות שאחר כך עושים casting אבל זה לא ברור לי מיסודו,כי תמיד מלבישים על ההסבר הזה את "העקרון החשוב של polimorphism",אבל תסבירו לי את זה בלי ההקשר ל polimorphism, (מביא את הדוגמא פעם שניהה בפורום) נניח יש לי מחלקה נגזרת בשם WORKER ,ומחלקת הבסיס שממנה גוזרים בשם PERSON ויש מחלקת יישום בשם VAD הנה הקוד:
class person { string firstname; string lastname; } class worker :person { public void Print() { System.Console.WriteLine("Hello!!"); } } class vad { static public void Main() { person first=new person(); person second=new worker(); } }​
אז יש לנו 2 אובייקטים חדשים שיצרנו כאשר השני זה משהתכוונת במשפט שלך כאשר אמרתה "יכול להיות מקרה שמשתנה מסוג מסויים מאותחל כמופע של מחלקה שיורשת ממנו" והם:
person first=new person(); person second=new worker();​
לגבי המשפט הראשון נניח שהבנתי,יצרתי אובייקט ששמו first מהמחלקה person והאובייקט הזה מכיל את כל משמוגדר במחלקת person אבל המשפט השני מסבך לי את כל מערכת העצבים שלי כי אני לי יכול להבין את ההיגיון שבו למרות כל משנאמר על ההעקרון החשוב של polimorphism ושככה מיישמים את העקרון הזה, אני מנסה להבין מה עכשיו מכיל בדיוק המשתנה second? מאיזה סוג האובייקט הזה?(person או worker) מקווה שהסברתי את עצמי ברור, תודה מראש!!
 

yuval k

New member
1. עבור סוג הנתונים הזה, כן

זה לא יהיה נכון עבור כל סוג נתונים. 2. אם יהיו מתודות [וירטואליות] של person שהן overridden ב-worker, הגירסה של worker תיקרא. אחרת, הגירסה של person תיקרא. יש כאן מאמר נחמד על זה...
 

TheReverend

New member
בוא ננסה להבהיר את זה קצת

הקצאת משתנה בצורה: int i או int i=0 זוהי יצירת משתנה(עם\בלי אתחול) שמוקצה על המחסנית. טווח החיים של משתנה זה הוא עד סוף הScope שבו הוא נוצר(סוף המתודה\סוף הפונקציה\סוף התוכנית\סוף הבלוק\בהריסת הקלאס - תלוי איפה הוא מוגדר). משתנה שמוקצה ע"י המילה השמורה new הוא משתנה המוקצה דינמית ולא על המחסנית. משתנה זה "ימות" רק במספר מקרים: 1. מחיקתו ע"י קריאה מפורשת ל DELETE או לdestructor (אם עובדים בC++) 2. מנגנון איסוף הזבל של DOTNET החליט שהגיע זמנו להתפנות מהזיכרון. העקרון הזה נכון גם עבור שפות תכנות אחרות.
 
למעלה