היררכיית הטיפוסים

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

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

בג'אווה ובשפות רבות אחרות (חלקן מונחות עצמים וחלקן לא) אפשר להגדיר טיפוסים חדשים ולהרחיב בכך את מערכת הטיפוסים. בכל פעם שאנו מגדירים מחלקה בג'אווה, אנו מוסיפים טיפוס לתוכנית. למשל, כאשר הגדרנו מחלקה בשם LinkedList יצרנו טיפוס חדש, שהפעולות האפשריות עליו הן קריאה לשירותים add, size, get, ולבנאי.

בג'אווה יש שלוש קטגוריות כלליות של טיפוסים: טיפוסים פרימיטיביים (int, double, וכדומה), מערכים, ומחלקות. הקטגוריה הכללית של מחלקות מתחלקת למספר תתי-קטגוריות: מחלקות (classes), מנשקים (interfaces), מחלקות מופשטות (abstract classes), וטיפוסי מנייה (enumeration types או בקיצור enums). עד כה נתקלנו רק במחלקות, אבל בהמשך נציג את שאר סוגי הטיפוסים הללו ונראה כיצד מגדירים אותם ומתי משתמשים בהם.

הטיפוסים בג'אווה אינם נפרדים זה מזה לחלוטין: בין טיפוסים עשוי להיות יחס מסויים, יחס שנקרא "סוג של" (is a). כבר ראינו שגם בין הטיפוסים הפרימיטיביים יש יחסים מסויימים: היחסים שמאפשרים הרחבה אוטומטית של טיפוסים מספריים. למשל, מכיון שכל ערך שניתן לייצג במשתנה מטיפוס int ניתן גם לייצג במשתנה מטיפוס long, השפה מתייחסת ל-long כאל "סוג של int" או כאל הרחבה של int

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

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

במגבלות מסויימות, אפשר להגדיר את שמונה המחלקות הללו בתוכנית ג'אווה כך שישקפו את היחסים הללו. כפי שנראה, הגדרה שמשקפת את היחסים הללו עשויה להיות מועילה מאוד בתיכנות. 

כאשר בוחנים את התכונות של יחס ה-"סוג של", מגיעים למסקנות הבאות:

שאלות

  1. מה לדעתך יהיו הטיפוסים בתוכנית שתפקידה לשלוט על רובוט, ומה יהיו יחסי ה-"סוג של" ביניהם? כדאי לצייר דיאגרמה של היחס. זוהי שאלה פתוחה ולא שאלה שיש לה תשובה אחת נכונה.