שלום! היום אנחנו מסיימים סדרת הרצאות על עקרונות OOP . בשיעור זה נדבר על פולימורפיזם. פולימורפיזם הוא היכולת להתייחס למספר סוגים כאילו היו אותו סוג. במקרה זה, ההתנהגות של אובייקטים תהיה שונה בהתאם לאיזה סוג הם שייכים. בואו נסתכל על הצהרה זו ביתר פירוט. נתחיל בחלק הראשון: "היכולת לעבוד עם מספר סוגים כאילו הם אותו סוג". איך סוגים שונים יכולים להיות זהים? נשמע קצת מוזר :/ זה בעצם פשוט. לדוגמה, מצב זה נוצר עם שימוש רגיל בירושה. בואו נראה איך זה עובד. נניח שיש לנו כיתת אב פשוטה
כאשר ה"הכללה" הזו אינה נדרשת, ולהיפך אנו צריכים שהתנהגות המינים תהיה שונה, כל סוג מתנהג אחרת. הודות לפולימורפיזם, אתה יוצר ממשק אחד (סט של שיטות) עבור מגוון רחב של מחלקות. בשל כך, המורכבות של תוכניות מצטמצמת. גם אם נרחיב את התוכנית ל-40 סוגי חתולים, עדיין יהיה לנו את הממשק הפשוט ביותר האפשרי - שיטה אחת
Cat
עם שיטה אחת run()
- "הפעלה":
public class Cat {
public void run() {
System.out.println("Бег!");
}
}
עכשיו בואו ניצור שלוש מחלקות שיורשות מ- Cat
, ו- , מציינים Lion
אריה , נמר וברדלס. Tiger
Cheetah
public class Lion extends Cat {
@Override
public void run() {
System.out.println("Лев бежит со speedю 80 км/ч");
}
}
public class Tiger extends Cat {
@Override
public void run() {
System.out.println("Тигр бежит со speedю 60 км/ч");
}
}
public class Cheetah extends Cat {
@Override
public void run() {
System.out.println("Гепард бежит со speedю до 120 км/ч");
}
}
אז יש לנו 3 כיתות. בואו נדמה מצב שבו נוכל לעבוד איתם כאילו הם אותה כיתה. בואו נדמיין שאחד החתולים שלנו חולה וזקוק לעזרתו של ד"ר איבולית. בואו ננסה ליצור חוג Aibolit
שיוכל לטפל באריות, נמרים וברדלסים.
public class Aibolit {
public void healLion(Lion lion) {
System.out.println("Лев здоров!");
}
public void healTiger(Tiger tiger) {
System.out.println("Тигр здоров!");
}
public void healCheetah(Cheetah cheetah) {
System.out.println("Гепард здоров!");
}
}
נראה שהבעיה נפתרה - הכיתה כתובה ומוכנה לשימוש. אבל מה נעשה אם נרצה להרחיב את התוכנית שלנו? עכשיו יש לנו רק 3 מינים: אריות, נמרים וברדלסים. אבל יש יותר מ-40 מינים של חתולים בעולם. תארו לעצמכם מה יקרה אם נוסיף לתכנית כיתות נפרדות לחתולים של פאלאס, יגוארים, קון מיין, חתולי בית וכל השאר. התוכנית עצמה, כמובן, תתפקד, אבל הכיתה Aibolit
תצטרך להוסיף כל הזמן שיטות חדשות לטיפול בכל סוג של חתול, וכתוצאה מכך הוא יגדל לגדלים חסרי תקדים. כאן נכנסת לתמונה התכונה של פולימורפיזם - "היכולת לעבוד עם כמה סוגים כאילו הם אותו סוג." אנחנו לא צריכים ליצור אינספור שיטות שיעשו את אותו הדבר – לטפל בחתול. שיטה אחת תספיק לכל המקרים בבת אחת:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
}
}
healCat()
אנו יכולים להעביר גם אובייקטים Lion
וגם Tiger
אובייקטים לשיטה Cheetah
- כולם Cat
:
public class Main {
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
}
פלט מסוף:
Пациент здоров!
Пациент здоров!
Пациент здоров!
כך הכיתה שלנו Айболит
יכולה לעבוד עם טיפוסים שונים כאילו הם אותו טיפוס. כעת נעסוק בחלק השני: "במקרה זה, ההתנהגות של אובייקטים תהיה שונה בהתאם לאיזה סוג הם שייכים". גם כאן הכל פשוט. בטבע, כל החתולים רצים אחרת. לכל הפחות, מהירות הריצה שלהם שונה. מבין שלושת חיות המחמד שלנו, הצ'יטה היא המהירה ביותר, בעוד הנמר והאריה רצים לאט יותר. כלומר, ההתנהגות שלהם שונה. פולימורפיזם לא רק נותן לנו את היכולת להשתמש בסוגים שונים כאחד. יחד עם זאת, הוא מאפשר לנו לא לשכוח את השונות ביניהם ומשמר את ההתנהגות הספציפית לכל אחד מהם. ניתן להבין זאת בדוגמה זו. בואו נגיד שאחרי החלמה מוצלחת, החתולים שלנו החליטו להתרוצץ קצת כדי לחגוג. בואו נוסיף את זה לכיתה שלנו Aibolit
:
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
cat.run();
}
}
בואו ננסה להפעיל את אותו קוד לטיפול בשלוש חיות:
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
וכך תיראה התוצאה:
Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
כאן אנו רואים בבירור שההתנהגות הספציפית של החפצים שלנו נשמרה, למרות שהעברנו את כל שלושת החיות לשיטה, "הכללה" כל אחת מהן ל Cat
. הודות לפולימורפיזם, ג'אווה זוכרת היטב שלא מדובר רק בשלושה חתולים, אלא באריה, בנמר ובצ'יטה, שרצים אחרת. זהו היתרון העיקרי של שימוש בפולימורפיזם-גמישות . כאשר אנו צריכים ליצור פונקציונליות מסוימת המשותפת לסוגים רבים, אריות, נמרים וברדלסים פשוט הופכים ל"חתולים". כל החיות שונות, אבל במצבים מסוימים - חתול הוא חתול, לא משנה לאיזה מין הוא שייך :) הנה אישור וידאו עבורכם.
run()
לכל 40 החתולים.
GO TO FULL VERSION