DCSIMG
Question from Tapuz .Net forum: Class Pointers in .Net 101 (with Tree Collection) - Justin myJustin = new Justin( Expriences.Current );

Question from Tapuz .Net forum: Class Pointers in .Net 101 (with Tree Collection)

שאלה:

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

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

יש מושג "מצביעים" או תחליף להם בvb.net?האם זו בכלל הגישה הנכונה?

 

תשובה:

    public class SomeClass
    {
        private List<SomeClass> _children = new List<SomeClass>();
        public List<SomeClass> Children
        {
            get { return _children; }
            set { _children = value; }
        }

        private SomeClass _father;
        public SomeClass Father
        {
            get { return _father; }
            set
            {
                _father = value;
                _father.Children.Add(this);
            }
        }
    }

// examples of use:
            SomeClass root = new SomeClass();

            SomeClass son = new SomeClass();
            son.Father = root;

            SomeClass son2 = new SomeClass();
            son2.Father = root;

            // get second soon
            root.Children[1];

            // get brother of son
            son.Father.Children[son.Father.Children.IndexOf(son) + 1];

מדובר בעיקר בהבנה של איך אוספים (גם באנגלית: Collections) עובדים בדוט נט.

יצרנו מחלקה מסוג SomeClass שמכילה הפנייה למחלקה אחרת מסוג SomeClass בתוך מאפיין (גם באנגלית: Property) שנקרא Father. בפועל, כל מה שאמרנו זה "יש לי מאפיין בשם Father שמחזיר ומקבל מחלקה מטיפוס SomeClass" וגם באיזהשהו שלב קבענו את ערך Father ואז באיזהשהו שלב תיחקרנו את הערך הזה.
בנוסף חשפנו מערך ג'נרי (שזה רק אומר שיש מערך עם גודל משתנה מבחינתנו) של מחלקות אחרות מסוג SomeClass ואותו מערך ג'נרי נקרא Children.

היות והמערך הג'נרי הוא Strongly-typed ומיישם את ממשק ה-IList אנחנו מקבלים את היכולת לנווט בתוך האוסף (שימוש ב-IndexOf, add, remove, contains ומה לא) וגם שלתוצאה של אותו ניווט נקבל כמופע של SomeClass ונוכל ישירות לעבוד מולו עם אותם מאפיינים שיצרנו. ולמשל באמת נוכל לקבל את האח הבא של הילד הנוכחי בזה שנחפש את המיקום של הילד הנוכחי בתוך ילדי האב ונוסיף אחד לאותו מיקום.

בדוט נט אין מצביעים פר-סה, אלא אנחנו יודעים שאם יש לי משתנה מסוג מחלקה ישאר שם מצביע על הדבר הזה שנקרא זכרון. לעומת זאת, זה לא משנה לנו כי אנחנו לא מטפלים בזכרון. מבחינתנו, כל עוד אני יכול לקבוע שאני מחזיק משתנה מסוג מחלקה ואז אני יכול לגשת אליו זה מספיק טוב לנו.יש מצבים למשל שלא ישמרו מצביעים אלא העתקים על הזכרון (למשל שנעבוד עם Structים ולא עם Classים).

עץ רגיל בהחלט בא בחשבון כאן והיות ומבנה דומה יושם כחלק מפרוייקט C5 Collections שזה פרוייקט חופשי המכיל אין ספור סוגי אוספים ג'נרים, בהחלט תוכל להשתמש בו.

TreeBag<SomeClass> myTree = new TreeBag<SomeClass>();
myTree.Add(root);
myTree.Add(son);
myTree.Add(son2);

בנוסף קיים פרוייקט ב-codeproject שממש ממשק קצת יותר חזק לעצים וחושף הרבה יותר מתודת ומאפיינים שאופיינים לעץ. הפרוייקט C5 Collection אנחנו מקבלים עץ שרק מייצר מבנה עץ מאחורי הקלעים, כאשר הפרוייקט ב-codeproject באמת מאפשר לתחקר ולשנות את מבנה העץ. :

DTreeNode<string> root = new DTreeNode<string>();
DTreeNode<string> temp;

temp = root.Nodes.Add("Hello");
temp.Nodes.Add("olleH");

temp = root.Nodes.Add("World");
temp.Nodes.AddRange(new string[] { "dWorl", "ldWor", "rldWo", "orldW" } );

כתובות אינטרנט נילוות:
קישור #1: The C5 Generic Collection Library, האתר הרשמי
קישור #2: Generic Tree in C#, ב-codeproject.com

 

קישור: http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=831&msgid=89241431

Published Tuesday, November 21, 2006 9:01 PM by Justin-Josef Angel [MVP]

Comments

No Comments