CodeGym /בלוג Java /Random-HE /פולימורפיזם בג'אווה
John Squirrels
רָמָה
San Francisco

פולימורפיזם בג'אווה

פורסם בקבוצה
היי! היום אנו מסכמים סדרה של שיעורים על עקרונות ה-OOP. בשיעור זה נדבר על פולימורפיזם של ג'אווה. פולימורפיזם הוא היכולת לעבוד עם מספר סוגים כאילו היו אותו סוג. יתרה מכך, התנהגות האובייקטים תהיה שונה בהתאם לסוגם. בואו נסתכל מקרוב על ההצהרה הזו. נתחיל בחלק הראשון: 'היכולת לעבוד עם כמה סוגים כאילו הם אותו סוג'. איך סוגים שונים יכולים להיות זהים? זה נשמע קצת מוזר :/ כיצד להשתמש בפולימורפיזם - 1למעשה, הכל מאוד פשוט. לדוגמה, מצב זה מתעורר במהלך שימוש רגיל בירושה. בוא נראה איך זה עובד. נניח שיש לנו מחלקת אב פשוטה של ​​Cat עם שיטת run() אחת :

public class Cat {

   public void run() {
       System.out.println("Run!");
   }
}
כעת ניצור שלושה מחלקות שיורשים את החתול : אריה , נמר וצ'יטה .

public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Lion runs at 80 km/h");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Tiger runs at 60 km/h");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Cheetah runs at up to 120 km/h");
   }
}
אז יש לנו 3 כיתות. בואו נעצב את המצב שבו נוכל לעבוד איתם כאילו הם אותה כיתה. תארו לעצמכם שאחד החתולים שלנו חולה וזקוק לעזרה מד"ר דוליטל. בואו ננסה ליצור כיתת דוליטל שיכולה לרפא אריות, נמרים וברדלסים.

public class Dolittle {

   public void healLion(Lion lion) {

       System.out.println("Lion is healthy!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Tiger is healthy!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Cheetah is healthy!");
   }
}
נראה שהבעיה נפתרה: השיעור כתוב ומוכן לצאת לדרך. אבל מה נעשה אם נרצה להרחיב את התוכנית שלנו? כרגע יש לנו רק 3 סוגים: אריות, נמרים וברדלסים. אבל יש יותר מ-40 סוגי חתולים בעולם. תארו לעצמכם מה יקרה אם היינו מוסיפים כיתות נפרדות למנולים, יגוארים, מיין קונס, חתולי בית וכל השאר. כיצד להשתמש בפולימורפיזם - 2התוכנית עצמה, כמובן, תפעל, אבל עלינו להוסיף כל הזמן שיטות חדשות לכיתה דוליטל כדי לרפא כל סוג של חתול. כתוצאה מכך, הוא יגדל לגדלים חסרי תקדים. כאן נכנס לתמונה הפולימורפיזם - "היכולת לעבוד עם כמה סוגים כאילו הם אותו סוג". אנחנו לא צריכים ליצור אינספור שיטות לעשות את אותו הדבר - לרפא חתול. שיטה אחת מספיקה לכולן:

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
   }
}
שיטת healCat() יכולה לקבל אובייקטים של אריה , טייגר וברדלס - כולם מקרים של Cat :

public class Main {

   public static void main(String[] args) {

       Dolittle dolittle = new Dolittle();

       Lion simba = new Lion();
       Tiger shereKhan = new Tiger();
       Cheetah chester = new Cheetah();

       dolittle.healCat(simba);
       dolittle.healCat(shereKhan);
       dolittle.healCat(chester);
   }
}
פלט קונסולה: המטופל בריא! החולה בריא! החולה בריא! אז כיתת דוליטל שלנו עובדת עם סוגים שונים כאילו הם אותו סוג. כעת נתמודד עם החלק השני: "יתרה מכך, התנהגות האובייקטים תהיה שונה בהתאם לסוג שלהם". הכל מאוד פשוט. בטבע, כל חתול רץ בצורה אחרת. לכל הפחות, הם פועלים במהירויות שונות. מבין שלושת החתולים שלנו, הצ'יטה היא המהירה ביותר, בעוד הנמר והאריה רצים לאט יותר. במילים אחרות, ההתנהגות שלהם שונה. פולימורפיזם עושה יותר מאשר רק מאפשר לנו להשתמש בסוגים שונים כאחד. זה גם מאפשר לנו לזכור את ההבדלים ביניהם, ולשמור על ההתנהגות הספציפית לכל אחד מהם. הדוגמה הבאה ממחישה זאת. נניח שהחתולים שלנו, לאחר החלמה מוצלחת, החליטו ליהנות מריצה קטנה. נוסיף את זה לשיעור הדוליטל שלנו :

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
       cat.run();
   }
}
בואו ננסה להריץ את אותו קוד לטיפול בשלוש חיות:

public static void main(String[] args) {

   Dolittle dolittle = new Dolittle();

   Lion simba = new Lion();
   Tiger shereKhan = new Tiger();
   Cheetah chester = new Cheetah();

   dolittle.healCat(simba);
   dolittle.healCat(shereKhan);
   dolittle.healCat(chester);
}
וכך נראות התוצאות: המטופל בריא! אריה רץ במהירות 80 קמ"ש. החולה בריא! טייגר רץ במהירות של 60 קמ"ש. החולה בריא! צ'יטה פועל במהירות של עד 120 קמ"ש כאן אנו רואים בבירור שההתנהגות הספציפית של עצמים נשמרת, למרות שהעברנו את כל שלושת החיות לשיטה לאחר ש'הכללנו' אותן לחתול . בשל פולימורפיזם, ג'אווה זוכרת היטב שלא מדובר רק בשלושה חתולים. הם אריה, נמר וצ'יטה, שכל אחד מהם פועל בצורה שונה. זה ממחיש את היתרון העיקרי של הפולימורפיזם: גמישות. כאשר אנו צריכים ליישם פונקציונליות מסוימת המשותפת לטיפוסים רבים, אז אריות, נמרים וברדלסים פשוט הופכים ל"חתולים". כל החיות שונות, אבל במצבים מסוימים חתול הוא חתול, ללא קשר למין שלו :) הנה כמה אישור וידאו בשבילך.
כאשר ה'הכללה' הזו אינה רצויה ואנחנו צריכים במקום זאת שכל מין יתנהג אחרת, כל סוג עושה את שלו. הודות לפולימורפיזם, אתה יכול ליצור ממשק אחד (סט של שיטות) עבור מגוון רחב של מחלקות. זה הופך תוכניות לפחות מסובכות. גם אם נרחיב את התוכנית לתמיכה ב-40 סוגי חתולים, עדיין יהיה לנו את הממשק הפשוט ביותר: שיטת run() אחת לכל 40 החתולים.
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION