Πολύ πολύ γρήγορα γιατί πρέπει να πάω να ψηφίσω :)
Το interface δεν είναι δομή μόνο της C# αλλά σχεδόν όλων των αντικειμενοστρεφών γλωσσών προγραμματισμού. Το interface, με απλά λόγια, υποδηλώνει ακριβώς αυτό που λες: Οτι μια κλάση θα χρησιμοποιεί συγκεκριμένα methods με συγκεκριμένα signatures (αριθμό και τύπο παραμέτρων). Ουσιαστικά ορίζει ένα "συμβόλαιο" (contract) για τη χρήση της κλάσης.
Πού είναι το ωραίο; Οτι μπορείς να έχεις ΠΟΛΛΕΣ κλάσεις που να χρησιμοποιούν (implement) το ίδιο interface. Αν και οι κλάσεις αυτές μπορεί να κάνουν διαφορετικά πράγματα, υπάρχει κάτι που τις ενώνει: Το interface. Εκτός από το οτι το interface σου δίνει έναν αυστηρό τρόπο να ορίσεις συγκεκριμένες μεθόδους και properties στις κλάσεις που το υλοποιούν (με αποτέλεσμα να κινδυνεύεις λιγότερες φορές να κάνεις λάθος) σου επιτρέπει να περνάς σαν παράμετρο ένα object σε κάποια method κάποιας άλλης κλασης ως interface, χωρίς να σε πολυνοιάζει τι κλάσης πραγματικά είναι το object. Ετσι, σου δίνει τη δυνατότητα να είσαι "ανοιχτός" σε περαιτέρω τροποποιήσεις.
Φαντάσου τις κλάσεις Coffee, Tea και Milk οι οποίες κάνουν όλες implement το interface ISweeten. To interface αυτό ορίζει οτι όλες οι κλάσεις πρέπει να έχουν μια μέθοδο ονόματι AddSugar. Ετσι λοιπόν εσύ μπορείς να φτιάξεις αύριο - μεθαύριο και την κλάση π.χ. OrangeJuice, η οποία θα κάνει implement το ίδιο interface, δηλαδή θα ΠΡΕΠΕΙ να έχει και αυτή μια μέθοδο AddSugar.
Στη συνέχεια ας πούμε οτι έχεις κάπου αλλού στον κώδικά σου μια κλάση ονόματι DrinksManager η οποία έχει τη μέθοδο ServeDrink. Η μέθοδος αυτή μπορεί να δέχεται ως παράμετρο οποιαδήποτε κλάση ακολουθεί το interface ISweeten. Ετσι λοιπόν δεν σε νοιάζει ποιά πραγματικά κλάση περνάς ως παράμετρο, αρκεί αυτή να ακολουθεί αυτό το interface. Αυριο-μεθαύριο στον κώδικά σου μπορεί να υπάρξει και κάποια καινούρια κλάση που θα αντιπροσωπεύει ένα ποτό, π.χ. TomatoJuice. Αν και αυτή κάνει implement το interface ISweeten, τότε στον κώδικα της ServeDrink δεν θα χρειαστεί να αλλάξεις ΑΠΟΛΥΤΩΣ τίποτα μια και η μέθοδος αυτή δέχεται ως παράμετρο ένα interface και όχι ένα συγκεκριμένο class. Θα μπορείς να περάσεις σαν παράμετρο ένα object τύπου TomatoJuice στη ServeDrink όπως θα έκανες και με όλα τα μέχρι τώρα objects σου.
Τα παραπάνω είναι πολυ-πολύ απλά και γενικά και δυστυχώς λόγω έλλειψης χρονου δεν προλαβαίνω να επεκταθώ - επιφυλάσσομαι :)
Σωτήρης Φιλιππίδης
DotSee Web Services