Διεπαφές (Interfaces)
Μια διεπαφή (interface) είναι σαν ένα συμβόλαιο που λέει στις κλάσεις τι μεθόδους ή ιδιότητες πρέπει να υλοποιήσουν, χωρίς να τους λέει πώς να το κάνουν. Σκέψου τη διεπαφή σαν μια λίστα με υποχρεώσεις που πρέπει να τηρήσει μια κλάση.
Χαρακτηριστικά των Διεπαφών:
- Μόνο δηλώσεις: Μια διεπαφή δηλώνει μεθόδους ή ιδιότητες, αλλά δεν περιέχει κώδικα για το πώς ακριβώς θα λειτουργούν. Αυτό το αφήνει στις κλάσεις που θα υλοποιήσουν τη διεπαφή.
- Πολλαπλή κληρονομικότητα: Μια κλάση μπορεί να υλοποιεί πολλές διεπαφές. Αυτό είναι σημαντικό γιατί επιτρέπει την ευελιξία της κληρονομικότητας στην C#.
- Χωρίς πεδία ή κατασκευαστές: Στις διεπαφές δεν μπορούμε να έχουμε πεδία (μεταβλητές) ή κατασκευαστές.
Παράδειγμα Διεπαφής:
// Δημιουργία μιας διεπαφής
public interface IVehicle
{
void StartEngine(); // Δήλωση μεθόδου
void StopEngine();
}
Εδώ η διεπαφή IVehicle δηλώνει ότι όποια κλάση την υλοποιήσει θα πρέπει να έχει τις μεθόδους StartEngine() και StopEngine().
Μια κλάση που υλοποιεί αυτή τη διεπαφή πρέπει να παρέχει συγκεκριμένη υλοποίηση για αυτές τις μεθόδους:
public class Car : IVehicle
{
public void StartEngine()
{
Console.WriteLine(“Η μηχανή του αυτοκινήτου ξεκινά.”);
}
public void StopEngine()
{
Console.WriteLine("Η μηχανή του αυτοκινήτου σταματά.");
}
}
Αφηρημένες Κλάσεις (Abstract Classes)
Μια αφηρημένη κλάση (abstract class) είναι μια κλάση που μπορεί να περιέχει τόσο δηλωμένες (αφηρημένες) όσο και υλοποιημένες μεθόδους. Μια αφηρημένη κλάση δεν μπορεί να δημιουργηθεί άμεσα (δεν μπορείς να δημιουργήσεις αντικείμενο από αφηρημένη κλάση), αλλά χρησιμοποιείται ως βάση για άλλες κλάσεις που την κληρονομούν.
Χαρακτηριστικά των Αφηρημένων Κλάσεων:
- Μπορεί να περιέχει κώδικα: Σε αντίθεση με τις διεπαφές, οι αφηρημένες κλάσεις μπορούν να περιέχουν και κανονικές μεθόδους με κώδικα και αφηρημένες μεθόδους χωρίς υλοποίηση.
- Μπορεί να περιέχει πεδία: Οι αφηρημένες κλάσεις μπορούν να περιέχουν πεδία (μεταβλητές) και κατασκευαστές.
- Κληρονομικότητα: Μια κλάση μπορεί να κληρονομήσει μόνο μία αφηρημένη κλάση.
Παράδειγμα Αφηρημένης Κλάσης:
// Δημιουργία αφηρημένης κλάσης
public abstract class Animal
{
public abstract void MakeSound(); // Αφηρημένη μέθοδος
public void Sleep()
{
Console.WriteLine("Το ζώο κοιμάται.");
}
}
Η αφηρημένη κλάση Animal
έχει μια αφηρημένη μέθοδο MakeSound()
(η οποία πρέπει να υλοποιηθεί από τις υποκλάσεις) και μια κανονική μέθοδο Sleep()
.
Μια κλάση που κληρονομεί την Animal
πρέπει να υλοποιήσει την αφηρημένη μέθοδο:
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine(“Ο σκύλος γαβγίζει.”);
}
}
Διαφορές μεταξύ Διεπαφών και Αφηρημένων Κλάσεων
Χαρακτηριστικό | Διεπαφές (Interfaces) | Αφηρημένες Κλάσεις (Abstract Classes) |
---|---|---|
Υλοποίηση μεθόδων | Δεν περιέχουν κώδικα υλοποίησης | Μπορούν να περιέχουν κώδικα υλοποίησης |
Πεδία (μεταβλητές) | Δεν έχουν πεδία | Μπορούν να έχουν πεδία και κατασκευαστές |
Πολλαπλή κληρονομικότητα | Μπορεί να υλοποιηθούν πολλές διεπαφές | Μια κλάση μπορεί να κληρονομήσει μόνο μία αφηρημένη κλάση |
Καταλληλότητα | Χρήσιμες όταν θες να εφαρμόσεις μια “συμπεριφορά” σε πολλές κλάσεις | Κατάλληλες όταν έχεις κοινό κώδικα που θέλεις να μοιραστούν οι υποκλάσεις |
Πότε να χρησιμοποιήσεις τι;
- Διεπαφές (Interfaces): Όταν θέλεις να δώσεις μια κοινή λειτουργικότητα σε πολλές κλάσεις, χωρίς να σε νοιάζει πώς ακριβώς θα υλοποιηθεί. Μπορείς να σκεφτείς τις διεπαφές σαν ένα σχέδιο που λέει στις κλάσεις τι πρέπει να κάνουν.
- Αφηρημένες Κλάσεις (Abstract Classes): Όταν θες να δημιουργήσεις μια βάση με κοινό κώδικα για πολλές κλάσεις, αλλά κάποιες μέθοδοι θα πρέπει να υλοποιηθούν από τις υποκλάσεις. Χρησιμοποιούνται όταν οι κλάσεις που κληρονομούν έχουν πολλά κοινά στοιχεία, αλλά και κάποιες διαφορές.