שאלה ב-#c בנוגע ל-virtual method

שאלה ב-#c בנוגע ל-virtual method

שלום חברים,

התחלתי ללמוד את השפה ונתקלתי באיזשהו חוסר הבנה, ובכל מקום שקראתי לא הבנתי את התשובה (אולי באמת אין היגין בתשובה ואני סתם מחפש).
המצב שאני מדבר עליו הוא מחלקה הנגזרת ממחלקת האב, שבמחלקת האב יש שיטה שמוגדרת כוירטואלית.
במידה, ובמחלקה הנגזרת אני מממש את המתודה שמוגדרת כוירטואלית במחלקת האב, אך בחתימה משתמש במילת המפתח "new", אז לפי המינוח של מייקרוסופט המשמעות היא שאני מסתיר (Hiding) את השיטה הנ"ל של מחלקת האב.
אני לא כל כך מבין מה פה בבדיוק ההסתרה? הרי אובייקטים מטיפוס הבן שמוצבעים ע"י משתנה ייחוס מטיפוס האב יריצו את השיטה של מחלקת האב (זאתי שמוגדרת כוירטואלית). אז איפה פה בדיוק ההסתרה?!?

תודה רבה לעוזרים!
 
אין קשר בין השאלה שלך ל virtual method

התשובה לשאלה ״למה קוראים לזה הסתרה״ נראית לי ברורה רק בהקשר של name resolution.

אם לא חושבים על זה בהקשר של name resolution, אני מוצא, כמוך, שאין שום הגיון במינוח הזה...
 
לא מכיר את הנושא name resolution אבל...

בהסברים של מייקרוסופט בנושא המתודות הוירטואליות והמחלקות הנגזרות משתמשים במושג הזה כל הזמן! ואני פשוט לא מצליח להבין
&nbsp
 

bismark1

New member
איפה אתה מסתבך?

באופן עקרוני, אם במחלקת הבסיס ובמחלקה הנגזרת יש שתי פונקציות עם אותה חתימה קורה אחד משניים :
1. הפונקציה במחלקת הבסיס היא וירטואלית והפונקציה במחלקה הנגזרת היא עם override - הפונקציה שתקרא נקבעת עפ"י סוג האובייקט המוצבע בפועל.
2. הפונקציה במחלקה הנגזרת מוכרזת עם new (בלי קשר להאם הפונקציה במחלקת הבסיס וירטואלית או לא) - הפונקציה שתקרא תקבע לפי סוג המחלקה שהוכרז.
עכשיו - אם אתה שואל, מה הטעם בלהכריז new באופן מפורש במקרה 2, הרי זה מה שיקרה בכל מקרה? נכון, אבל זה עניין של סדר בקוד - כל פעם שלפונקציה במחלקה נגזרת יש חתימה זהה לפונקציה במחלקת הבסיס רוצים שהמתכנת יצהיר בצורה מפורשת מה ההתנהגות הרצויה (זה יעבוד גם בלי new אגב אבל אז תקבל אזהרה). תחשוב על זה בצורה פרקטית - דמיין שאתה קורא עכשיו קוד של המחלקה הנגזרת שמישהו אחר כתב. אתה ממש לא רוצה לרוץ לבדוק עבור כל פונקציה אם היא קיימת גם במחלקת הבסיס (שיכולה להיות מוגדרת בכלל בקובץ אחר) ואז לתהות האם מי שכתב את הקוד התכוון להסתיר את הקוד של הבסיס או לא... המילה new עושה לך את החיים יותר קלים במובן הזה.
 
השאלה שלי היא מה זה:"להסתיר את הקוד של הבסיס"

ציטוט ממשפט שרשמת שמתחיל בסוף השורה הלפני אחרונה ונגמר בשורה האחרונה
 

bismark1

New member
הכוונה היא זו

נניח שנתון לי המצב הבא:
public class Base{
//some stuff here...
... public int Func() { return 0; }}public class Derived : Base{ //some other stuff here ...}
ונכתוב את הקוד הבא:
class Program{
static void Main()
{
Derived derived = new Derived(); int num = derived.Func(); }}
הפונקציה שתופעל היא Func המוגדרת במחלקה Base. אפשר לחשוב על זה כאילו האובייקט מסוג Derived "שקוף" לקריאות לפונקציות למחלקת הבסיס שלו.

לעומת זאת אם ב-Derived הייתה גם כן פונקציה Func:
public class Derived : Base{
...

public new int Func()
{ return 42; }}
עבור אותו קוד:
class Program{
static void Main()
{ Derived derived = new Derived(); int num = derived.Func(); }}
תקרא הפונקציה Func המוגדרת ב-Derived. ניתן לחשוב על זה כאילו כעת הפונקציה ב-Derived "מסתירה" (מצופה דמיוני שלא מכיר את המבנה הפנימי ואת ההיררכיה של המחלקות) את הפונקציה באותו השם במחלקת הבסיס.
 
למעלה