CodeGym /בלוג Java /Random-HE /שיטה ושיעורים מופשטים של Java
John Squirrels
רָמָה
San Francisco

שיטה ושיעורים מופשטים של Java

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

מהי שיטה מופשטת?

שיטה מופשטת היא שיטה שאין לה יישום. כלומר, יש לו רק הצהרה, אז אתה יודע את השם, סוג ההחזר והמשתנים שהוא יקבל. הנה דוגמה לשיטה מופשטת בסיסית:
public abstract int example(int a1, int a2);
כאשר אתה מסתכל על השיטה הזו, אתה יכול לדעת שהיא מחזירה מספר שלם והיא מקבלת שני מספרים שלמים כטיעון שלה. מה שאתה לא יכול לדעת זה איך שיטה זו מיושמת. זה בגלל שכדי ליישם את זה, אתה צריך לעקוף את זה. בעת יצירת שיטה מופשטת ב-java, עליך לציית למספר הנחיות, אחרת התוכנית שלך לא תעשה קומפילציה נכונה. זכור:
  • לשיטות מופשטות של Java אין יישום. כלומר, לעולם אין לעקוב אחריהם פלטה מתולתלת וגוף שמספר כיצד יש להשתמש בשיטה. זה פשוט נגמר בנקודה-פסיק.

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

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

שניים האחרונים עשויים להיות קצת מבלבלים, אז בואו נבהיר את זה מיד.

הרחבת שיעורי ג'אווה מופשטים

נניח שאנו רוצים לכתוב תוכנית על צורות בסיסיות שיחזירו היקף ושטח. אז אנחנו יוצרים כיתת אב מופשטת. אבל בגלל שלכל צורה יש חוקים משלה, כל אחד מהם חייב להיות מחושב בצורה שונה, אז אנחנו כותבים את המחלקה המופשטת Shape כך:
abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) {
    			this.shapeName = name;
  		}

abstract double area();
  		abstract double perimeter();
}
כעת, אם ברצוננו להשתמש בפועל בשיטות המופשטות הללו, עלינו להרחיב את מחלקת האב המופשטת של Java Shape ולאחר מכן ליצור מופע של השיטות. אז כל מחלקה בטון חייבת ליישם את השיטות המופשטות של השטח וההיקף.
class Quadrilateral extends Shape
{
    double length, width;

    Quadrilateral(double l, double w, String name)
    {
        super(name);
        this.length = l;
        this.width = w;
    }

    @Override
    public double perimeter()
    {
        return ((2*length)+(2*width));
    }

    @Override
    public double area()
    {
        return (length*width);
    }
}

Implementing the Quadrilateral class would then look like this
class Main
{
    public static void main (String[] args)
    {

        // creating a Quadrilateral object using Shape as reference
        Shape rectangle = new Quadrilateral(3,4, "Rectangle");
        System.out.println("Area of rectangle is " + rectangle.area());
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());

    }
}
הפלט מהמסוף נראה כך:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
שימו לב שהמחלקה Quadrilateral לא חייבת ליצור את הבנאי Shape(String name) ממחלקת האב Shape . זה בגלל שזו לא שיטה מופשטת. עם זאת, אם יישמו רק אזור או היקף במחלקה, המחלקה החדשה תצטרך להיות מופשטת מכיוון שהיא לא כוללת את שניהם. אתה יכול גם להשתמש בשיטות מופשטות בממשקים.

שיטות ג'אווה מופשטות עם ממשקים

בואו נסקור במהירות מה זה ממשק ובמה הוא שונה ממחלקה מופשטת. בממשק, כל המשתנים המוצהרים בממשק הם ציבוריים, סטטיים וסופיים. מחלקות מופשטות לעומת זאת, יש רק משתנים לא סופיים. הכל בממשק הוא ציבורי כברירת מחדל. מחלקה מופשטת יכולה להיות פרטית, מוגנת, ציבורית וכו'. לבסוף, מחלקה לא מרחיבה ממשק, היא מיישמת אותו. לפני JDK 8, ממשק לא יכול היה לכלול בו שום דבר מלבד שיטות מופשטות. כעת, לממשק יכולות להיות שיטות ברירת מחדל ושיטות סטטיות. בשל כך, שיטות העבודה המומלצות התרחקו משימוש בשיטות מופשטות כתבניות הניתנות להרחבה והתמקדו בממשקים ובהטמעתם. אז אם הייתם יוצרים את Shape כממשק ואז מיישמים אותו כמרובע , איך זה היה נראה? ראשית, תצטרך לבטל את הבנאי Shape(שם מחרוזת) . זה ייראה כך רק עם שתי השיטות המופשטות:
interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {

  double length, width;

    	  Quadrilateral(double l, double w) {

    	    this.length = l;
    	    this.width = w;
    	  }

    	  @Override
    	  public double perimeter() {

    	    return ((2*length)+(2*width));
    	  }

    	  @Override
    	  public double area() {

   	    return (length*width);
    	  }
}
לבסוף, השימוש ברבעון החדש כפי שהוא מיישם את ממשק הצורה יהיה זהה:
class Main
{
    public static void main (String[] args)
    {

        // creating a Quadrilateral object using Shape as reference
        Shape rectangle = new Quadrilateral(3,4);
        System.out.println("Area of rectangle is " + rectangle.area());
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());

    }
}
והדפסת הקונסולה תיראה כך:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
אם תרצה לחקור יותר על ההבדלים בין ממשקים לשיעורים מופשטים, תוכל למצוא מידע נוסף כאן.

אבל למה להשתמש בשיטות ג'אווה מופשטות?

ישנן סיבות רבות מדוע נעשה שימוש בשיטות מופשטות ב-Java ומדוע אתה צריך להרגיש בנוח עם השימוש בהן. הנה שלוש סיבות מהירות מדוע כדאי להשתמש בהן כשזה מתאים.
  1. הימנע מכפילות של מאמצים - הסתכל אחורה על קידוד הדוגמה שלנו; דמיינו שאתם והצוות שלכם צריכים ליצור כיתות לצורות שאינן מלבן. כמה דרכים שונות יש שתוכלו להמציא לעיצוב הכיתה הזו? עשר? חֲמֵשׁ עֶשׂרֵה? וזו בעיה פשוטה. דמיינו משהו הרבה יותר מורכב. אתה והצוות שלך יכולים להמציא מאה דרכים. אז תעמוד בפני המשימה המפחידה של לשזור אותם יחד לתוכנית קוהרנטית. זה מביא אותנו לנקודה הבאה שלנו: הגדרת יישום.

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

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

הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION