Middle
Γιατί χρειάζονται οι διεπαφές αν ήδη υπάρχουν αφηρημένες κλάσεις;
sobes.tech AI
Απάντηση από AI
- Πολλαπλή κληρονομιά. Μια κλάση μπορεί να υλοποιεί πολλά interfaces, αλλά να κληρονομεί μόνο από μια κλάση (συμπεριλαμβανομένων των αφηρημένων).
interface IDrivable {} interface IFlyable {} class Car : IDrivable {} // Κληρονομεί μόνο από μια κλάση (το αντικείμενο έμμεσα) class FlyingCar : IDrivable, IFlyable {} // Υλοποιεί πολλά interfaces - Σύμβαση χωρίς υλοποίηση. Τα interfaces ορίζουν μόνο μια σύμβαση (μεθόδους, ιδιότητες, γεγονότα, δείκτες) χωρίς καμία υλοποίηση. Οι αφηρημένες κλάσεις μπορούν να περιέχουν μερικώς υλοποιημένη λειτουργικότητα και πεδία.
interface IShape { double GetArea(); // Μόνο δήλωση } abstract class Shape { public abstract double GetArea(); // Δήλωση public string Color { get; set; } // Υλοποίηση ιδιότητας public void DisplayColor() { Console.WriteLine($"Χρώμα: {Color}"); // Υλοποιημένη μέθοδος } } - Αδύναμος συσχετισμός (loose coupling). Τα interfaces προάγουν τον αδύναμο συσχετισμό μεταξύ συστατικών, καθώς ο κώδικας εξαρτάται από τη σύμβαση, όχι από την συγκεκριμένη υλοποίηση της κλάσης. Αυτό διευκολύνει την αντικατάσταση μιας υλοποίησης με μια άλλη.
- Διαίρεση ρόλων. Τα interfaces επιτρέπουν τον ορισμό σαφών ρόλων ή δυνατοτήτων που πρέπει να διαθέτει μια κλάση, ανεξάρτητα από τον κύριο τύπο ή την ιεραρχία κληρονομιάς.
- Δοκιμές. Τα mocks και τα stubs για μονάδες δοκιμών συχνά δημιουργούνται με βάση τα interfaces, όχι τις αφηρημένες κλάσεις, καθώς αυτές μπορεί να έχουν εξαρτήσεις ή πολύπλοκη εσωτερική λογική.
Συνοψίζοντας: τα interfaces παρέχουν έναν ευέλικτο μηχανισμό για τον ορισμό συμβάσεων και την επίτευξη πολυμορφισμού χωρίς τους περιορισμούς της κληρονομιάς από μια μόνο βασική κλάση, ενώ οι αφηρημένες κλάσεις προορίζονται να παρέχουν μερική υλοποίηση και βασική λειτουργικότητα, η οποία θα συμπληρωθεί σε τις παράγωγες κλάσεις.