Abstract Class Vs. Διεπαφή σε Java: Επεξήγηση με Παραδείγματα

Οι αφηρημένες κλάσεις και οι διεπαφές χρησιμοποιούνται για αφαίρεση στην Java. Η αφαίρεση στον αντικειμενοστραφή προγραμματισμό αναφέρεται στην απόκρυψη λεπτομερειών υλοποίησης από τους τελικούς χρήστες.

Αφηρημένα, μπορείτε να γνωρίζετε ποιες είναι οι λειτουργίες, αλλά δεν μπορείτε να ξέρετε πώς εφαρμόστηκαν.

Ας δούμε καθένα από αυτά και ας προσπαθήσουμε να καταλάβουμε γιατί χρησιμοποιούνται.

Αφηρημένη τάξη

Μια κλάση που δεν μπορεί να δημιουργηθεί ως αντικείμενο και μπορεί να έχει ή να μην έχει αφηρημένες μεθόδους σε αυτήν ονομάζεται αφηρημένη κλάση στην Java. Μια αφηρημένη μέθοδος είναι μια μέθοδος που δεν έχει φορέα υλοποίησης όταν δηλώνεται.

Παράδειγμα αφηρημένης κλάσης GraphicObject – Oracle

Μπορείτε να δημιουργήσετε μια αφηρημένη τάξη καθορίζοντας την αφηρημένη λέξη-κλειδί πριν από τη λέξη-κλειδί κλάσης.

abstract class abstractClass {
    void run() {
        System.out.println("ran");
    }
}

Μια αφηρημένη τάξη μπορεί να επεκταθεί από άλλες κλάσεις. Με άλλα λόγια, μπορεί να υποταχθεί επίσης.

abstract class AbstractClass {
    void run() {
        System.out.println("ran");
    }
}

class ExtendingAbstractClass extends AbstractClass {
    void newMethod() {
        System.out.println("new");
    }

    @Override
    void run() {
        System.out.println("override");
    }
}

Οι αφηρημένες κλάσεις χρησιμοποιούνται για την υλοποίηση κοινών μεθόδων μεταξύ πολλαπλών κλάσεων που επεκτείνουν μια δεδομένη αφηρημένη κλάση. Επίσης, η δυνατότητα ορισμού αφηρημένων μεθόδων μέσα σε αφηρημένες κλάσεις τις καθιστά απίστευτα χρήσιμες σε κλάσεις που έχουν παρόμοιες μεθόδους αλλά με διαφορετικές υλοποιήσεις. Ας πάρουμε ένα παράδειγμα.

Σκεφτείτε ένα αυτοκίνητο που έχει ορισμένες λειτουργίες, όπως εκκίνηση, στάση, όπισθεν κ.λπ. Αυτές οι λειτουργίες είναι κοινές σε όλους τους τύπους αυτοκινήτων.

  8 Ερωτήσεις και απαντήσεις γωνιακής συνέντευξης [2022]

Τι γίνεται όμως με τις λειτουργίες αυτοματισμού όπως η αυτο-οδήγηση; Η υλοποίηση αυτών των λειτουργιών μπορεί να διαφέρει για διαφορετικούς τύπους αυτοκινήτων. Ας δούμε πώς μπορείτε να δημιουργήσετε ένα αντικειμενοστραφή πρόγραμμα που σχετίζεται με αυτό.

Πρώτα απ ‘όλα, δημιουργήστε μια κατηγορία αυτοκινήτου που θα επεκταθεί από πολλές κατηγορίες διαφορετικών τύπων αυτοκινήτων.

abstract class Car {
    void start() {
        // implementation
        System.out.println("runs car");
    }

    void stop() {
        // implementation
        System.out.println("engine stops");
    }

    void reverse() {
        // implementation
        System.out.println("reverse mode enabled");
    }

    abstract void selfDrive();
}

Η μέθοδος start(), stop() και reverse() είναι μέθοδοι που είναι κοινές σε όλα τα αυτοκίνητα. Άρα η εφαρμογή τους έχει ήδη οριστεί μέσα στην ίδια την κατηγορία Car. Ωστόσο, ένας συγκεκριμένος τύπος αυτοκινήτου μπορεί να έχει διαφορετικές εφαρμογές της λειτουργίας αυτοοδήγησης. Και έτσι, μπορείτε να ορίσετε την selfDrive() ως μια αφηρημένη μέθοδο και να την εφαρμόσετε με διαφορετικούς τρόπους σε διαφορετικές κατηγορίες διαφορετικών τύπων αυτοκινήτων.

class CarTypeA extends Car {
    @Override
    void start() {
        super.start();
    }

    @Override
    void stop() {
        super.stop();
    }

    @Override
    void reverse() {
        super.reverse();
    }

    void selfDrive() {
        // custom implementation
        System.out.println("Type A self driving mode enabled");
    }
}
class CarTypeB extends Car {
    // ...all similar methods

    void selfDrive() {
        // custom implementation
        // different implementation than CarTypeB
        System.out.println("Type B self driving mode enabled");
    }
}

Είναι σημαντικό να σημειωθεί ότι, εάν μια υποκλάση δεν υλοποιεί όλες τις αφηρημένες μεθόδους που ορίζονται στην κλάση αφηρημένης, τότε θα πρέπει να δηλωθεί ως αφηρημένη κλάση.

  Πώς να εισαγάγετε το μηδέν πριν από έναν αριθμό στα φύλλα Google

Διεπαφή

Μια διεπαφή είναι ένας τρόπος για να πει σε μια κλάση ποιες μέθοδοι πρέπει να εφαρμοστούν από αυτήν. Για παράδειγμα, αν λάβετε υπόψη το παράδειγμα ενός αυτοκινήτου, έχει κάποιες βασικές λειτουργίες. Μπορεί να ξεκινήσει, να κινηθεί και να σταματήσει. Αυτές οι λειτουργίες είναι κοινές σε όλα τα αυτοκίνητα.

Έτσι, εάν εφαρμόσετε μια διεπαφή ενός αυτοκινήτου σε μια κατηγορία, πρέπει να εφαρμόσετε όλες τις μεθόδους για να λειτουργεί σωστά και με ασφάλεια το αυτοκίνητο.

Παρόμοια με τις αφηρημένες κλάσεις, δεν μπορούμε να δημιουργήσουμε στιγμιότυπα ή να δημιουργήσουμε αντικείμενα μιας διεπαφής. Μπορεί να θεωρηθεί μια πλήρως αφηρημένη κλάση επειδή περιέχει μόνο αφηρημένες μεθόδους, δηλαδή μεθόδους χωρίς σώμα υλοποίησης.

Μπορείτε να δημιουργήσετε μια διεπαφή χρησιμοποιώντας τη λέξη-κλειδί διεπαφής.

interface CAR {
    void start();
    void stop();
    void move();
}

Υλοποιήστε μια διεπαφή χρησιμοποιώντας τη λέξη-κλειδί implements κατά τον ορισμό μιας κλάσης.

class CarTypeB implements CAR {
    public void start() {
        System.out.println("started");
    }

    public void stop() {
        System.out.println("stopped");
    }

    public void move() {
        System.out.println("running");
    }
}

Ομοιότητα

Καμία εγκατάσταση ως αντικείμενο δεν είναι το μόνο κοινό που έχουν οι αφηρημένες κλάσεις και οι διεπαφές.

Διαφορές

Abstract ClassInterfaceInheritance & ImplementationΜόνο μία αφηρημένη κλάση μπορεί να κληρονομηθεί από μια κλάση.Πολλαπλές διεπαφές μπορούν να υλοποιηθούν από μια κλάση.Τύποι μεταβλητήςΜπορεί να έχει τελικές, μη τελικές, στατικές και μη στατικές μεταβλητές. Μπορεί να έχει μόνο στατικές και τελικές μεταβλητές. Τύποι μεθόδουΜπορεί να περιέχει τόσο αφηρημένες όσο και μη αφηρημένες μεθόδους. Μπορεί να περιέχει μόνο αφηρημένες μεθόδους, αλλά οι στατικές μέθοδοι αποτελούν εξαίρεση. Τροποποιητές πρόσβασηςΜια αφηρημένη κλάση μπορεί να έχει έναν τροποποιητή πρόσβασης. Οι υπογραφές μεθόδων που ορίζονται στη διεπαφή είναι δημόσιες από προεπιλογή. Μια διεπαφή δεν έχει τροποποιητή πρόσβασης. Constructors & DestructorsΜπορεί να δηλώσει κατασκευαστές και καταστροφείς. Δεν μπορεί να δηλώσει κατασκευαστές ή καταστροφείς. SpeedFastSlowΔιαφορές μεταξύ αφηρημένης κλάσης και διεπαφής

  Πώς να ακυρώσετε τη συνδρομή My Tinder Gold

Πότε να χρησιμοποιήσετε την αφηρημένη κλάση και διεπαφή;

Χρησιμοποιήστε αφηρημένες τάξεις όταν:

  • Θέλετε να μοιραστείτε μερικές κοινές μεθόδους και πεδία μεταξύ πολλών κλάσεων.
  • Δήλωση μη στατικών και μη τελικών πεδίων προκειμένου να τροποποιηθεί η κατάσταση του αντικειμένου στο οποίο είναι δεσμευμένα.

Μπορείτε να χρησιμοποιήσετε διεπαφές όταν:

  • Θέλετε να ορίσετε τη συμπεριφορά μιας κλάσης που υλοποιεί τη διεπαφή, αλλά δεν σας ενδιαφέρει ο τρόπος με τον οποίο υλοποιείται.
  • Θέλετε να βεβαιωθείτε ότι μια κλάση υλοποιεί όλες τις μεθόδους για να λειτουργήσει σωστά.

Τελικές Λέξεις

Οι διεπαφές χρησιμοποιούνται κυρίως για τη δημιουργία API επειδή μπορούν να παρέχουν μια δομή για την υλοποίηση λειτουργιών χωρίς να ανησυχείτε για την πραγματική υλοποίηση.

Οι αφηρημένες κλάσεις χρησιμοποιούνται γενικά για να μοιράζονται κοινές αφηρημένες και μη αφηρημένες μεθόδους μεταξύ πολλαπλών κλάσεων, οι οποίες επεκτείνουν την κλάση αφηρημένης για να κάνουν τον κώδικα πιο επαναχρησιμοποιήσιμο.

Μάθετε περισσότερα για την Java με τη βοήθεια αυτών των διαδικτυακών μαθημάτων για java. Ετοιμάζεστε για μια συνέντευξη στην Java; Ακολουθούν ορισμένες ερωτήσεις συνέντευξης σχετικά με τον Αντικειμενοστραφή Προγραμματισμό.