ABA


"עזרה קטנה עם שאלת הורשה מאוד בסיסית"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15689 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15689
Static
חבר מתאריך 1.7.02
1329 הודעות
   09:30   24.01.10   
אל הפורום  
  עזרה קטנה עם שאלת הורשה מאוד בסיסית  
 
   שאלת הבנה בסיסית,
למה כשכותבים משהו כזה:


class Program
{
static void Main(string args)
{

BaseClass obj1 = new SubClass();

obj1.printMe();

Console.ReadKey();

}
}


class BaseClass
{
public virtual void printMe()
{
Console.WriteLine("Base Class");
}
}

class SubClass : BaseClass
{
public new void printMe()
{
Console.WriteLine("Sub Class");
}
}
}

פלט יוצא:

Base Class

אני לא מבין למה בגלל שיש NEW על הפונקציה בSUBCLASS הוא מתעלם ממנו ובכלל לא נכנס אליו כשאני עושה STEP BY STEP דיבאג.
הוא ישר הולך ל BASECLASS ולפונקציית ההדפסה שלו.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  מצאתי את התשובה... Static 24.01.10 10:27 1
     קודם כל, זה נורא חשוב לציין באיזו שפה מדובר בשאלות ldan192  24.01.10 10:36 2
         אחלה, תודה! Static 24.01.10 14:31 3
  זה כי NEW לא מבצע דריסה מן הסתם =/ ronen333  24.01.10 14:51 4

       
Static
חבר מתאריך 1.7.02
1329 הודעות
   10:27   24.01.10   
אל הפורום  
  1. מצאתי את התשובה...  
בתגובה להודעה מספר 0
 
   http://www.yoda.arachsys.com/csharp/faq/#override.new

בעצם אני מסתיר את הקוד של מחלקת base ויוצר פונקציה שתהיה יחודית למחלקה subclass.

כך שאם אני עושה BaseClass obj1 = new SubClass(); ואז obj1.printMe(); אז אני בעצם מריץ פונקציה מוסתרת של מחלקת baseclass כי אני יורש ממנה ולא "דורס" אותה בעצמי.


ואם אני עושה SubClass obj1 = new SubClass(); ואז obj1.printMe(); אז אני בעצם מריץ פונקציה חדשה לגמריי new של המחלקה subclass שאין לה קשר למחלקת ה baseclass

בקיצור נראה לי שהבנתי, תקנו אותי אם אני טועה, תודה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   10:36   24.01.10   
אל הפורום  
  2. קודם כל, זה נורא חשוב לציין באיזו שפה מדובר בשאלות  
בתגובה להודעה מספר 1
 
ערכתי לאחרונה בתאריך 24.01.10 בשעה 10:39 בברכה, ldan192
 
כאלה.
למרות שלפי ה-new וה-console מובן שזה #C.


התשובה היא כמעט כמו שאמרת.
ראשית, #C בעלת קישור סטטי.
כשמבצעים new לפונקציה, זה גורם להחבאת הפונקציה החדשה בפני מתודות האב (כמו שמתבצע בעצם ב-++C) ולא ל-overloading (כמו ב-Java) או ל-overriding (כמו שקורה עם פקודת ה-override).

תחשוב שעם new שמאחורי הקלעים printMe של Base מוגדר כ-_1234PrintMe וב-SubClass מוגדר כ-6752PrintMe_. שמות פונקציות שונות. call-ים שונים.
לכן, למרות הקישור הדינמי של printMe, הוא לא מזהה מתודה שדרסה/overloaded אותו ולכן הוא ניגש רק לזו שב-BaseClass.

אם תבצע downcasting הוא ידע לגשת לפונקציית ה-SubClass.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Static
חבר מתאריך 1.7.02
1329 הודעות
   14:31   24.01.10   
אל הפורום  
  3. אחלה, תודה!  
בתגובה להודעה מספר 2
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   14:51   24.01.10   
אל הפורום  
  4. זה כי NEW לא מבצע דריסה מן הסתם =/  
בתגובה להודעה מספר 0
 
   NEW בצרוף לפונקציה סך הכל אומר לקומפילר "אני יודע שיש פונקציה כזאת באב, אבל על הזין שלי. אני רוצה ליצור פונקציה חדשה".


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net