Dev-Time

Java Abstract VS. Interface

הקדמה

ג’אווה היא שפה תכנות מונחית עצמים (Object-Oriented Programming),

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

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

חלק מאוד משמעותי בתכנות מונחה עצמים הוא קבלת מבנה או לוגיקה מתוך מחלקות “על” שמגדירות לנו את המבנה, את הלוגיקה, או שילוב כלשהו ביניהם, פה נכנסות מחלקות abstract ו-interface.

עוד על תכנות מונחה עצמים:

 https://he.wikipedia.org/wiki/תכנות_מונחה-עצמים

ועכשיו לעניין, אז מה ההבדלים בין abstract ל-interface?

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

נתחיל מלהסביר את המטרה של כל אחד מהם,

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

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

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

אולי דוגמא ויזואלית תהיה ברורה יותר:

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

 

ופה אנחנו רואים את השימוש במחלקה Animal בתוך מחלקה Cow ואת ההטמעה של הפונקציה talk, ההגדרה הספציפית לפרה של מספר הרגליים, והשימוש בפונציה getNumOfLegs ללא שינוי או כתיבה מחדש

 

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

לדוגמא:

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

עדי בניה

Add comment

Follow

Get every new post delivered to your Inbox

Join other followers