Java/აბსტრაქტული კლასები

ვინაიდან ჩვენს ზოოპარკში მხოლოდ ორი სახეობაა: ფრინველები და ძუძუმწოვრები; გაუგებარი ხდება თავად Animal კლასის დანიშნულება. ჩვენ არ გვინდა შევქმნათ ისეთი ობიექტი, რომელიც არც ფრინველია და არც ძუძუმწოვარი. ერთ-ერთი გამოსავალია გამოვაცხადოთ Animal კლასი აბსტრაქტულად. ამისათვის კლასის დეკლარაციაში უნდა ჩავამატოთ სიტყვა abstract:

package zoo;
 
public abstract class Animal {
    private String name;
 
    public Animal(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    public abstract boolean laysEgg();
}

ახლა კლასი აბტრაქტულია, public abstract class Animal დეკლარაციის თანახმად, და მისი პირდაპირ შექმნა არ შეიძლება. თუმცა აბსტრაქტულ კლასს დამატებით შეუძლია ქონდეს განუხორციელებული, ანუ აბსტრქტული, მეთოდები. ერთ-ერთი ასეთი მეთოდის მაგალითია გამოცხადება ბოლოს წინა ხაზში:

    public abstract boolean laysEgg();

ვინაიდან ზოგადად ცხოველისთვის ჩვენ არ ვიცით არის თუ არა ეს ცხოველი კვერცხის მდებელი, ეს მეთოდი აქ ვერ განხორციელდება. ის უნდა განხორციელდეს არააბსტრქტულ შთამომავალ კლასში. ასე მაგალითად Bird-ში მისი განხორციელება ასე შეიძლება:

    @Override
    public boolean laysEgg() {
        return true;
    }

ხოლო Mammal-ში კი ასე:

    @Override
    public boolean laysEgg() {
        return false;
    }

რა თქმა უნდა არის რომელიღაც ერთი ავსტრალიური ძუძუმწოვარა ცხოველი, რომელიც დებს კვერცხებს, მაგრამ აქ მისი განხილვის თავი არა გვაქვს.