ABA


"איך ניתן לזמן מתודה שהיא לא מוגדרת כ-static לפני Ctor?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #20486 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 20486
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   19:18   21.01.14   
אל הפורום  
  איך ניתן לזמן מתודה שהיא לא מוגדרת כ-static לפני Ctor?  
 
ערכתי לאחרונה בתאריך 21.01.14 בשעה 19:26 בברכה, -UC-
 
עד כמה שהבנתי עושים את זה עם reflection אבל לא מצאתי הסבר טוב :/

שפה: C#


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

  האשכול     מחבר     תאריך כתיבה     מספר  
  על איזה שפה אתה מדבר? Net_Boy  21.01.14 19:23 1
     C# -UC- 21.01.14 19:28 2
         כל Class Method מאחורי הקלעים מקבלת את ה Instance של הקלאס Net_Boy  21.01.14 19:44 3
             את הפתרון שהבאת אני מכיר -UC- 21.01.14 19:55 4
                 אני מניח שהפונקציה הספיצפית הזאת לא מבצעת שום פעולה על members של הקלאס Net_Boy  21.01.14 20:04 5
                     אני יודע שזה לא דבר נכון לעשות. אין לי ספק בכלל שזה לא דבר נכון לעשות -UC- 21.01.14 20:23 6
  לא חושב שאתה יכול לעשות כזה דבר בכלל.. Nesher  21.01.14 22:53 7
     תסתכל בתגובה 4 מה ניסיתי לעשות... -UC- 21.01.14 23:19 8
         מה הסיבה שאתה רוצה לעשות את זה? משה הלולן 21.01.14 23:26 9
         ראיתי את תגובה 4 ולכן ניסיתי להבין מה אתה רוצה לעשות Nesher  22.01.14 00:16 10
  אני מתקן את השאלה -UC- 22.01.14 11:42 11
     אחינו, לא תיקנת את השאלה.. הבנו מה אתה רוצה Nesher  22.01.14 12:07 12
  אולי אני תמים אבל מה הבעיה לבצע את הדבר הבא? last_test 22.01.14 20:23 13
  מתי אתה רוצה להריץ את הפונקציה שרצה לפני ה CTOR? inno3D 22.01.14 20:35 14
  זו שאלה מראיון עבודה? VeNom  23.01.14 09:21 15
     ניסיתי להסביר אותה שוב באחת התגובות... -UC- 23.01.14 10:11 16
         מה שהסברת לא נשמע כמו מה שהוא אמר.. בגדול אין אפשרות לבצע כלום באובייקט שהוא לא איציק2 23.01.14 18:22 17

       
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   19:23   21.01.14   
אל הפורום  
  1. על איזה שפה אתה מדבר?  
בתגובה להודעה מספר 0
 
   והשאלה לא כל כך מובנת, מה הכוונה בלקרוא לפונקציה לפני CTOR? למה שתצטרך דבר כזה?



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   19:28   21.01.14   
אל הפורום  
  2. C#  
בתגובה להודעה מספר 1
 
אני רוצה לזמן מתודה מתוך קלאס שאני יוצר. המתודה אינה מוגדרת static אלא רק public, ולכן בעיקרון אני צריך ליצור אובייקט מסוג הקלאס.

אני לא רוצה ליצור אובייקט, אלא רק לזמן את המתודה פעם אחת וזהו.

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

הסיבה לא ממש משנה כרגע אבל אודה בכל מקרה על כל עזרה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   19:44   21.01.14   
אל הפורום  
  3. כל Class Method מאחורי הקלעים מקבלת את ה Instance של הקלאס  
בתגובה להודעה מספר 2
 
   אני לא מבין כ"כ ב C# אבל ממה שהסתכלתי קצת ברשת ב Reflection אתה יוצר אובייקט Dummy ואותו פשוט שולח למתודה.

יש לך פה דוגמא איך עושים את זה.
http://stackoverflow.com/questions/8479469/call-non-static-method-in-reflection

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   19:55   21.01.14   
אל הפורום  
  4. את הפתרון שהבאת אני מכיר  
בתגובה להודעה מספר 3
 
נגיד ויש לך את הקלאס הבא:



public class MethodBeforeCtor
{

public MethodBeforeCtor()
{
System.Console.WriteLine("Ctor");
}

public void MethodToActBeforeCtor()
{
System.Console.WriteLine("MethodToActBeforeCtor");
}
}



אני רוצה לזמן את המתודה MethodToActBeforeCtor מבלי ליצור אובייקט כלשהו מסוג הקלאס.

את הקוד הזה אני מזמן כבר ב-MAIN:

 

Type myTypeObj = typeof(MethodBeforeCtor);
var instance = Activator.CreateInstance(myTypeObj);
MethodInfo myMethodInfo = myTypeObj.GetMethod("MethodToActBeforeCtor");

myMethodInfo.Invoke(instance, null);


אבל הוא עדיין קודם יוצר אובייקט כביכול(Instance) וה-ctor רץ. אני לא רוצה שה-ctor ירוץ.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   20:04   21.01.14   
אל הפורום  
  5. אני מניח שהפונקציה הספיצפית הזאת לא מבצעת שום פעולה על members של הקלאס  
בתגובה להודעה מספר 4
 
   ולכן זה צועק שהפונקציה הזאת צריכה להיות:
1ׂ) מחוץ לקלאס
2) פונקציה סטטית

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

Having said that,
אני בקושי נגעתי בC# בחיי אבל אם אני צריך להמר הייתי אומר שתנסה להגדיר את ה Instance שלך כObject ואז אתה תקבל את התוצאה הרצויה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   20:23   21.01.14   
אל הפורום  
  6. אני יודע שזה לא דבר נכון לעשות. אין לי ספק בכלל שזה לא דבר נכון לעשות  
בתגובה להודעה מספר 5
 
וניסיתי את להגדיר את Instance כ-object אבל זה לא עוזר...

עדיין מחפש פתרון למצב הזה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק, 43 נקודות
   22:53   21.01.14   
אל הפורום  
  7. לא חושב שאתה יכול לעשות כזה דבר בכלל..  
בתגובה להודעה מספר 0
 
ברגע שאתה מגדיר אובייקט, אין מצב להריץ מתודה לפני הבנאי שלו
גם במתודה סטטית הוא יריץ קודם כל את הבנאי ורק אז את המתודה הסטטית

אם תסביר מה מטרת ההרצה אולי נוכל לעזור לך למצוא פתרון חלופי


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   23:19   21.01.14   
אל הפורום  
  8. תסתכל בתגובה 4 מה ניסיתי לעשות...  
בתגובה להודעה מספר 7
 
רציתי לדעת האם יש אפשרות לבצע דבר כזה ואם כן, אז איך..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
משה הלולן לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 11.6.13
4818 הודעות, 8 פידבק, 14 נקודות
   23:26   21.01.14   
אל הפורום  
  9. מה הסיבה שאתה רוצה לעשות את זה?  
בתגובה להודעה מספר 8
 
   תפרט מה אתה עושה כנראה יש פתרון יותר טוב


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק, 43 נקודות
   00:16   22.01.14   
אל הפורום  
  10. ראיתי את תגובה 4 ולכן ניסיתי להבין מה אתה רוצה לעשות  
בתגובה להודעה מספר 8
 
כמו שאמרתי, מה שאתה רוצה לעשות לא אפשרי
גם הקוד של Reflection שעשית יצור מופע של האובייקט ויריץ בנאי לפני שהמתודה תרוץ
הפתרון היחידי שבאמת אפשרי זה ליצור בנאי ריק וזה בעצם לא יעשה כלום מלבד להריץ את המתודה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   11:42   22.01.14   
אל הפורום  
  11. אני מתקן את השאלה  
בתגובה להודעה מספר 0
 
איך להריץ את המתודה בקלאס הזה לפני ה-CTOR מבלי להשתמש ב-STATIC
אין צורך לאפשר זימון שלה מבחוץ


public class MethodBeforeCtor
{

public MethodBeforeCtor()
{
System.Console.WriteLine("Ctor");
}
public void MethodToActBeforeCtor()
{
System.Console.WriteLine("MethodToActBeforeCtor");
}
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק, 43 נקודות
   12:07   22.01.14   
אל הפורום  
  12. אחינו, לא תיקנת את השאלה.. הבנו מה אתה רוצה  
בתגובה להודעה מספר 11
 
http://stackoverflow.com/questions/11066727/oop-how-to-call-a-function-before-the-class-constructor

אתה די מתעקש על משהו שהוא בלתי אפשרי..
בכל מקרה, בהצלחה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
last_test
חבר מתאריך 20.8.13
328 הודעות, דרג אמינות חבר זה
   20:23   22.01.14   
אל הפורום  
  13. אולי אני תמים אבל מה הבעיה לבצע את הדבר הבא?  
בתגובה להודעה מספר 0
 
   ב-CTOR שלך פשוט תקרא לפונקציה שאתה מעוניין שתרוץ לפני כל הלוגיקה שהוא מבצע/תהפוך את הפונקציה עצמה להיות ה-CTOR שלך?

פתרון אחר הוא להשתמש ב-Copy Constructor.

http://msdn.microsoft.com/en-us/library/ms173116.aspx


פתרון קצת יותר מורכב הוא לייצר דינאמית את המחלקה, ולהשתמש ב-DefineConstructor.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
inno3D
חבר מתאריך 21.4.02
4533 הודעות, דרג אמינות חבר זה
   20:35   22.01.14   
אל הפורום  
  14. מתי אתה רוצה להריץ את הפונקציה שרצה לפני ה CTOR?  
בתגובה להודעה מספר 0
 
   אם אפשר קצת יותר פרטים

פעם אחת?
תמיד לפני CTOR?
באופן יזום?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   09:21   23.01.14   
אל הפורום  
  15. זו שאלה מראיון עבודה?  
בתגובה להודעה מספר 0
 
   כי אם כן, אז אתה לא מסביר אותה לגמרי נכון.
צריך שיודפס in printer לפני in C's CTOR בלי להשתמש בדברים סטטים(CTOR) ובלי לגעת במיין.
הנה השאלה(בערך):


Main()
{
C c = new C();
}

public class C
{
public void Printer()
{
MessageBox.Show("In Printer");
}

public C()
{
MessageBox.Show("In C's CTOR");
}
}


הפתרון:


Main()
{
C c = new C();
}

public class C : B
{
public override void Printer()
{
MessageBox.Show("In Printer");
}

public C()
{
MessageBox.Show("In C's CTOR");
}
}

public class B
{
public virtual void Printer()
{
}

public B()
{
Printer();
}
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-UC- לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
21922 הודעות, 1 פידבק, 2 נקודות
   10:11   23.01.14   
אל הפורום  
  16. ניסיתי להסביר אותה שוב באחת התגובות...  
בתגובה להודעה מספר 15
 
אתה הצלחת להבין מה אני רוצה לעשות..

אגב, גם שימוש ב-inner class ויצירת אובייקט ממנו נותן פתרון...



public class C
{
class Printer
}
public Printer()
{
MessageBox.Show("In Printer");
}
}

Printer printer = new Printer();

public C()
{
MessageBox.Show("In C's CTOR");
}
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
איציק2
חבר מתאריך 26.4.08
2436 הודעות, דרג אמינות חבר זה
   18:22   23.01.14   
אל הפורום  
  17. מה שהסברת לא נשמע כמו מה שהוא אמר.. בגדול אין אפשרות לבצע כלום באובייקט שהוא לא  
בתגובה להודעה מספר 16
 
   סטטי לפני קריאה לבנאי.
החלק הסטטי של האובייקט נוצר עם עליית התכנית..
מה שגם אתה וגם מעליך הצעתם זה עדיין ליצור אובייקט חדש.
פשוט הצורה שבחרתם לעשות את זה היא שהאובייקט שאתם יוצרים יהיה מסוג מחלקה אחרת... כלומר על השאלה המקורית שלך אתה ענית..


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

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

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



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