מחלקה (תכנות)

מחלקה (Class) היא המסגרת הבסיסית של תכנות מונחה-עצמים. זהו אוסף של משתנים (הנקראים שדות), מאפיינים ופונקציות (הנקראות שיטות) המאוגדים למבנה לוגי אחד ופועלים יחד. בניגוד לתכנות הפרוצדורלי שבו ישנה הפרדה בין נתונים לפונקציות, והנתונים הם מבנה פאסיבי שגורם חיצוני פועל בהם, בתכנות מונחה עצמים ישנה האחדה בין הנתונים והפונקציות, כך שמבנה הנתונים הוא בעל פונקציות שפועלות עליו עצמו. למשתנה של מחלקה קוראים שדה, ולפונקציה של מחלקה נהוג לקרוא שיטה (Method), כדי לבדל ביניהם לבין משתנים ופונקציות רגילים. מבחינה מהותית, מחלקה מתארת ישות מופשטת על מאפייניה ופעולותיה ומימושה בפועל הוא באמצעות עצם (אובייקט). העצם יכול להיות עצם מהעולם האמיתי שבו מטפלת התוכנה (למשל, אם התוכנה מנהלת מלאי במחסן, המחלקה יכולה לתאר פריט במלאי), או עצם במחשב (למשל, מבנה נתונים מסוים). המחלקה מכילה מידע אודות העצם, ופונקציות המאפשרות לבצע פעולות על העצם, כמו לשנות את המידע בו, להפעיל אותו על עצמים אחרים, וכדומה. בשפות הראשונות שמימשו תכנות מונחה עצמים כמו C++ המחלקה הכילה משתנים ושיטות, (ביניהן שיטות שמטרתן לחשוף משתנים כלפי חוץ), בשפות שונות כמו VB ובמיוחד במודרניות כמו ג'אווה ו-#C המחלקה הורחבה כך שהיא מכילה לא רק משתנים ושיטות, אלא גם מאפיינים מובנים (שחושפים משתנים פנימיים) ואירועים. בכל מחלקה קיימות שתי פונקציות שמופעלות באופן אוטומטי על המופעים שלה בעת יצירתם ובעת מחיקתם. בעת יצירת המופע תופעל פונקציית בנאי (Constructor), באמצעותה אפשר לאתחל את האובייקט, לעיתים באמצעות פרמטרים המועברים אליה. בעת הריסת האובייקט תופעל פונקציה הורסת (Destructor), באמצעותה אפשר למשל לשחרר זיכרון שהיה בשימוש על ידי העצם, או למחוק אובייקטים אחרים שכבר אין בהם צורך. ברוב השפות המילה השמורה this משמשת להתייחסות עצמית במחלקה. למשל, בשפת PHP: class name { var $name; function name() { $this->name = "OOP"; } } שמות נוספים לכינוי עצמי של המחלקה בשפות אחרות Me ו-Self. כל מחלקה מוקדשת בדרך כלל לטיפול בנושא מוגדר אחד - טיפול בקבצים, תקשורת עם מסד הנתונים וכדומה. מחלקה יכולה להיות אבסטרקטית, כלומר מחלקה שבה לפחות פונקציה אחת אינה ממומשת (ולכן מוגדרת כאבסטרקטית). מחלקה יכולה להיות ממשק, כלומר אוסף של פונקציות שאינן ממומשות אלא מגדירות ממשק שכל מחלקה המרחיבה אותה חייבת לממש אותן (או להיות אבסטרקטית או ממשק בצורה רקורסיבית). מחלקה יכולה להיות סטטית או בעלת פונקציות סטטיות, כלומר מדובר במחלקה שכדי להפעיל את השיטות שבה אין צורך ליצור מופע שלה, אלא רק להשתמש בשם המחלקה. למימוש המחלקה קוראים אובייקט, כאשר כל הפונקציות והמשתנים שאינם סטטיים שייכים אליו ואפשר להשתמש בהם דרכו. פונקציות סטטיות שייכות למחלקה עצמה, ואמורות להיקרא דרך המחלקה ולא האובייקט. למשל, בשפת Java: class Name { String myName = "myName"; static String myStaticName = "myStaticName"; public void printName() { System.out.println("My name is " + myName); } public static void printStaticName() { System.out.println("My name is " + myStaticName); } } class UseName { public static void main(String[] args) { Name name = new name(); name.printName(); // prints "My name is myName" Name.printStaticName(); // prints "My name is myStaticName" } } מחלקה משמשת בין היתר ליצירת טיפוסי משתנים חדשים (משוכללים) המובנים במערכת הפיתוח, והדבר מהווה מימוש של תכנות מונחה עצמים, למשל ב-#C מחלקות משמשת לבניית מבנים מפורסמים כמו רשימה, מחסנית, תור, עץ בינארי ועץ משחק. למעשה בשפה זו משתנים פרמיטיביים אף הם מוגדרים כמחלקות, וכל דבר בשפה נעשה באמצעות מחלקות. public class name() { //Options variable variable name; ....... //Constructors public name class(variable type name,...,) { this.name variable=variable; .... } //Methods public variable type Get() { return this.name type; } public void Set(variable type name) { this.variable name=type name ; } } // End class אובייקט (מדעי המחשב) תכנות מונחה-עצמים תוכנה - מונחים מחלקות ועצמים, באתר הראשי של PHP הסבר על מחלקות ובנייתן באתר וובמאסטר