ProtoType

4 בSeptember 2012

2 תגובות

 

Prototype



















פרוטוטייפ – אבטיפוס בעברית

מהו אבטיפוס כשמדברים על object oriented?

בוא נניח שיש לי קלאס  A, ויש
לי מופע שלו שנקרא
A1.

מה אם היתה לי היכולת גם כשאין לי  public constructor

ליצור מופע מאותו טיפוס בהתייחס ל  typeשל המופע הקיים,

ולא, לא בעזרת reflection

השימוש ב
prototype
 מוטמע
עמוק ב
#C רק לא בהכרח שמים אליו לב..

למעשה בעת ביצוע serialize  על
אובייקט ולאחר מכן נבצע
deserialize

ביצענו מחזור שלם של שימוש במנגנון prototype.clone ( שאותו מיד נסביר)


 

שאלה רטורית: מהם הפונקציות שיש לכל אובייקט ב #C  ?

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

Tostring

GetType

Equals

GetHashCode

זהו , נכון?

    טעיתם..  יש שם עוד קצת , ולמי שמתעצל לבדוק לבד נגלה
שיש גם

                                             memberwiseClone                      

ובכן תפקידה של הפונקציה האחרונה הוא לספק תמיכה לשכפול האובייקט.

אולם הפונקציה memberwiseClone() כהגדרתה, היא protected אז מי צריך אותה?

הפתרון הוא מימוש פשוט של Iclonable Interface שחושף פונקציית clone

שמחזירה  object   ובעצם מאפשרת את יצירת האובייקט החדש תוך הסתמכות על אב הטיפוס שלו

המימוש יכול להיות ידני   return
new  class

אבל עם קצת מחשבה גנרית נעדיף להשתמש באותה פונקציית memberwiseClone()

שמגיעה עם כל קלאס שיורש מobject 

ויודעת להחזיר שיכפול של הקלאס הנוכחי בלי להיגרר לטייפים.

שזה שימושי מאוד כשמדברים על
אב טיפוס ויצירה של שכפולים.

למעשה כדי להדגים מימוש של אבטיפוס נשתמש בדוגמא הקודמת של
סינגלטון.

למה? כי במימוש סינגלטון
בסיסי אנחנו מונעים יצירת מופעים,  
ונוח להבין מה את היכולת של שיכפול
אבטיפוס

 כשאין לי אפשרות ליצור מופע ואני לא יכול להשתמש ברפרנס לאובייקט.

כמובן שבעולם האמיתי סביר להניח ששימוש כזה הוא קצת נאיבי:

 

 

public class MyObject
: ICloneable

    {

        private static MyObject instance = new
MyObject ();

 

        public string Name { get; set; }

 

        protected MyObject ()

        {

                       // לכאן יש גישה רק מתוך הקלאס

            Name = “Only One Object”;

        }

 

        public static MyObject Instance

        {

                          // המופע הסטטי שתמיד נפנה אליו

            get
{ return instance; }

        }

 

        public object Clone()

        {

                       //פונקציית השיכפול            

            var v = MemberwiseClone();

            return v;

        }

 

    }

 

    class
Program

    {

 

        static void Main(string[] args)

        {

           Console.WriteLine(MyObject.Instance.Name);

 

            var obj = MyObject.Instance;

 

            MyObject cloned = (MyObject)obj.Clone();

           

            Console.WriteLine(cloned.Name);

 

            cloned.Name = “Second object”;

 

            Console.WriteLine(cloned.Name);

 

            Console.WriteLine(MySingleTonObject.Instance.Name);

           

// לאחר הדפסת הנתונים ניווכח שיש לנו שני אובייקטים עם
ערכים שונים

        }

    }

 

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

ברור לנו שהמופע המועתק לוקח עימו את כל הערכים של האינסטנס אולם
בשונה ממקרים
רגילים של a=b   כאן יש לנו עותק נפרד על
כל המשתמע מכך

.

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

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

2 תגובות

  1. אבי10 בSeptember 2012 ב 19:21

    יש עוד פונקציה חוץ מclone

    Reply
  2. jho kim29 בJanuary 2013 ב 5:06

    why IVRIT ?

    Reply