Τι θα δούμε σε αυτό το μάθημα; Οξηζκόο κηαο δηαζύλδεζεο (interface) κε ηελ πξνδηαγξαθή ηεο κνξθήο θαη ηνπ ηύπνπ επηζηξνθήο ηωλ κεζόδωλ. Υινπνίεζε κηαο δηαζύλδεζεο από κία δνκή ή κία θιάζε. Αλαθνξά ζε κία θιάζε κέζω κηαο δηαζύλδεζεο. Υινπνίεζε ηωλ θνηλώλ ζηνηρείωλ κηαο ηεξαξρίαο θιάζεωλ ζε κία αθαηξεηηθή (abstract) θιάζε. Υινπνίεζε ζθξαγηζκέλωλ (sealed) θιάζεωλ πνπ δελ κπνξνύλ λα ρξεζηκνπνηεζνύλ ωο θιάζεηο βάζεο γηα ηελ δεκηνπξγία παξάγωγωλ θιάζεωλ.
Τι είναι μία διασύνδεση (interface) Μία δηαζύλδεζε δειώλεη έλα ζύλνιν κεζόδωλ ρωξίο θαζόινπ πινπνίεζε. Μία θιάζε ή δνκή κπνξεί λα πινπνηήζεη ηελ δηαζύλδεζε πινπνηώληαο ηηο κεζόδνπο πνπ δειώλνληαη ζε απηή. Με απηόλ ηνλ ηξόπν ηα αληηθείκελα απηήο ηεο θιάζεο ή ηεο δνκήο είλαη πιένλ ζπκβαηά κε ηνλ ηύπν ηεο δηαζύλδεζεο θαη κπνξνύλ λα ρξεζηκνπνηεζνύλ όπνπ αλακέλνληαη αληηθείκελα ηνπ ηύπνπ ηεο δηαζύλδεζεο.
Γιατί χρειάζονται οι διασυνδέσεις; (1) Αο ππνζέζνπκε πωο πξνγξακκαηίδεηε κία νπξά πξνηεξαηόηεηαο. Η νπξά πξνηεξαηόηεηαο είλαη κία δνκή δεδνκέλωλ ζηελ νπνία ηα αληηθείκελα ηνπνζεηνύληαη πάληα κε αύμνπζα ζεηξά άζρεηα κε ηελ ζεηξά εηζαγωγήο ηνπο. Αο ππνζέζνπκε επηπιένλ πωο δελ γλωξίδεηε ηνλ ηύπν ηωλ αληηθεηκέλωλ πνπ ζα εηζαρζνύλ ζηελ νπξά. Τν κόλν πνπ γλωξίδεηε είλαη πωο ζα εηζαρζνύλ θάπνηα objects (ππελζπκίδεηαη πωο όιεο νη θιάζεηο ηεο C# είλαη παξάγωγεο ηεο θιάζεο object). Πνην πξόβιεκα ζα αληηκεηωπίζεηε θαηά ηνλ πξνγξακκαηηζκό ηεο νπξάο πξνηεξαηόηεηαο;
Γιατί χρειάζονται οι διασυνδέσεις; (2) Τν πξόβιεκα είλαη πωο δελ γλωξίδεηε κε πνηνλ ηξόπν ζα πξέπεη λα ζπγθξηζνύλ ηα αληηθείκελα κεηαμύ ηνπο. Αλ ήηαλ αθέξαηνη αξηζκνί ζα ρξεζηκνπνηνύζαηε ηελ αξηζκεηηθή ηνπο αμία, αλ ήηαλ string ηελ αιθαβεηηθή ηνπο ζεηξά. Σηελ πεξίπηωζή καο όκωο, κπνξεί λα είλαη νηηδήπνηε! Γηα λα ππεξβείηε απηό ην πξόβιεκα θαη λα πξνγξακκαηίζεηε ηελ νπξά πξνηεξαηόηεηαο, δειώλεηε κία δηαζύλδεζε θαη ππνρξεώλεηε ηνπο ρξήζηεο ηεο νπξάο ζαο λα πινπνηήζνπλ ηελ δηαζύλδεζε κε ηελ αθόινπζε ζεκαζία:
Γιατί χρειάζονται οι διασυνδέσεις; (3) interface IComparable int CompareTo(object obj); Η κέζνδνο CompareTo ζα πξέπεη λα: 1. Επηζηξέθεη 0 αλ ην ζηηγκηόηππν ηεο θιήζεο είλαη ίζν κε ην obj 2. Επηζηξέθεη αξλεηηθό αξηζκό αλ ην ζηηγκηόηππν ηεο θιήζεο είλαη κηθξόηεξν από ην obj 3. Επηζηξέθεη ζεηηθό αξηζκό αλ ην ζηηγκηόηππν ηεο θιήζεο είλαη κεγαιύηεξν από ην obj Τν System namespace νξίδεη ηελ δηαζύλδεζε IComparable ήδε κε ηελ ζεκαζία πνπ αλαθέξεηαη εδώ. Ωο πξνγξακκαηηζηέο ηεο νπξάο πξνηεξαηόηεηαο κπνξείηε λα ρξεζηκνπνηήζεηε ηελ δηαζύλδεζε θαηά ηηο ζπγθξίζεηο. Δειαδή ζηελ νπξά ζα εηζάγεηε αληηθείκελα ηεο δηαζύλδεζεο IComparable. Όζνη ζέινπλ λα ρξεζηκνπνηήζνπλ ηελ νπξά ζαο ζα πξέπεη λα πινπνηήζνπλ ηελ δηαζύλδεζε απηή κε ηελ ζπγθεθξηκέλε ζεκαζία πνπ ηεο δώζαηε εζείο.
Παράδειγμα δήλωσης διασύνδεσης Δειώλνπκε κία δηαζύλδεζε ILandBound. Η δηαζύλδεζε έρεη κία κόλν κέζνδν (πξνζέμηε πωο δελ βάδνπκε public ή θάηη άιιν) πνπ νλνκάδεηαη NumberOfLegs θαη επηζηξέθεη έλαλ αθέξαην αξηζκό. Πξνζέμηε πωο ε δηαζύλδεζε απιά δειώλεη ηελ ιεηηνπξγία απηή. Δελ ηελ πινπνηεί! namespace InterfacesExample1 interface ILandBound int NumberOfLegs(); Γηα λα δειώζεηε κία δηαζύλδεζε ρξεζηκνπνηείηε ηελ δεζκεπκέλε ιέμε interface αθνινπζνύκελε από ην όλνκα ηεο δηαζύλδεζεο θαη αλνίγεηε άγθηζηξα. Μέζα ζηα άγθηζηξα γξάθεηε ηηο κεζόδνπο ηεο δηαζύλδεζεο. Γηα θάζε κέζνδν δίλεηε ηελ κνξθή ηεο (ηύπνο επηζηξνθήο, όλνκα, παξάκεηξνη). Δελ δίλεηε πξνζδηνξηζηή πξόζβαζεο (π.ρ. public). Οη δειώζεηο ηωλ κεζόδωλ ηεξκαηίδνληαη κε έλα εξωηεκαηηθό. Δελ έρεηε δειαδή πινπνίεζε ηεο κεζόδνπ κέζα ζηελ δηαζύλδεζε.
Παράδειγμα κλάσεων που υλοποιούν την διασύνδεση Οη θιάζεηο Human θαη Horse πινπνηνύλ ηελ δηαζύλδεζε ILandBound θαη παξέρνπλ επνκέλωο ηελ πινπνίεζε ηεο κεζόδνπ NumberOfLegs: namespace InterfacesExample1 class Human : ILandBound public int NumberOfLegs() return 2; namespace InterfacesExample1 class Horse : ILandBound public int NumberOfLegs() return 4;
Υλοποίηση διασύνδεσης Όηαλ πινπνηείηε κία δηαζύλδεζε ζα πξέπεη νη αληίζηνηρεο κέζνδνη πινπνίεζεο λα ηαηξηάδνπλ αθξηβώο κε απηέο πνπ δειώζεθαλ ζηελ δηαζύλδεζε: Τν νλόκαηα ηωλ κεζόδωλ ζα πξέπεη λα είλαη όπωο αθξηβώο δειώζεθαλ ζηελ δηαζύλδεζε. Οη ηύπνη ηωλ παξακέηξωλ θαζώο επίζεο θαη νη ιέμεηο-θιεηδηά ref θαη out (αλ ππάξρνπλ) ζα πξέπεη λα ηαηξηάδνπλ απόιπηα. Οη κέζνδνη πνπ πινπνηνύλ κεζόδνπο κηαο δηαζύλδεζεο ζα πξέπεη λα είλαη δεκόζηεο (public) εθηόο θαη αλ ρξεζηκνπνηήζεηε ξεηή (explicit) πινπνίεζε δηαζύλδεζεο, νπόηε θαη δελ ζα βάιεηε θαζόινπ ην public. Οη κέζνδνη πνπ πινπνηνύλ κία δηαζύλδεζε κπνξνύλ πξναηξεηηθά λα ρξεζηκνπνηήζνπλ ρηηή (explicit) σλοποίηζη διαζύνδεζης (π.ρ. ILandBound.NameOfLegs αληί γηα NameOfLegs). Απηό είλαη ρξήζηκν αλ πινπνηείηε ζηελ ίδηα θιάζε δύν δηαζπλδέζεηο πνπ έρνπλ ην ίδην όλνκα κεζόδνπ. Αλ δελ αθνινπζήζεηε ηνπο πην πάλω θαλόλεο ηόηε ε θιάζε πνπ πινπνηεί ηελ δηαζύλδεζε δελ ζα κεηαγιωηηηζηεί επηηπρώο.
Αναφορά σε κλάσεις μέσω διασυνδέσεων Όηαλ κία θιάζε πινπνηεί κία δηαζύλδεζε ηόηε απνθηά ηνλ ηύπν ηεο (δειαδή ηα αληηθείκελα ηεο θιάζεο, ζεωξνύληαη αληηθείκελα θαη ηεο δηαζύλδεζεο). Επνκέλωο άιια πξνγξάκκαηα κπνξνύλ λα αλαθεξζνύλ ζε αληηθείκελα θιάζεωλ πνπ πινπνηνύλ δηαζπλδέζεηο, κέζω ηωλ δηαζπλδέζεωλ. Σην παξάδεηγκα πνπ αθνινπζεί ε εληνιή foreach, δνπιεύεη γηα θάζε αληηθείκελν πνπ πινπνηεί ηελ δηαζύλδεζε ILandBound.
Παράδειγμα χρήσης της διασύνδεσης using System; namespace InterfacesExample1 class Program static void Main(string[] args) ILandBound[] landboundmammals = new ILandBound[2]; landboundmammals[0] = new Horse(); landboundmammals[1] = new Human(); foreach (ILandBound mammal in landboundmammals) Console.WriteLine(mammal.NumberOfLegs()); Console.ReadKey();
Επιπλέον παρατηρήσεις για τις διασυνδέσεις Μία θιάζε κπνξεί λα πινπνηήζεη πεξηζζόηεξεο από κία δηαζπλδέζεηο νη νπνίεο ρωξίδνληαη κε θόκκα. Γηα παξάδεηγκα: public class A : ILandBound, IFourLegs Όηαλ αλαθεξόκαζηε ζε αληηθείκελα κέζω δηαζπλδέζεωλ, κπνξνύκε λα αλαθεξζνύκε κόλν ζηηο κεζόδνπο πνπ ππάξρνπλ ζηελ δηαζύλδεζε θαη όρη ζηηο άιιεο κεζόδνπο πνπ ελδερνκέλωο ππνζηεξίδεη ην αληηθείκελν. Δελ κπνξείηε λα δεκηνπξγήζεηε αληηθείκελα κηαο δηαζύλδεζεο. Γηα παξάδεηγκα ε εληνιή: ILandBound l = new ILandBound(); είλαη ζπληαθηηθό ιάζνο, δηόηη ην ILandBound είλαη δηαζύλδεζε θαη όρη θιάζε πνπ πινπνηεί ηελ δηαζύλδεζε. Αληηζέηωο ε εληνιή ILandBound l = new Horse(); είλαη νξζή, εθόζνλ βέβαηα ε θιάζε Horse πινπνηεί ηελ δηαζύλδεζε ILandBound.
Περιορισμοί για τις διασυνδέσεις Δελ κπνξείηε λα δειώζεηε πεδία ζε κία δηαζύλδεζε (π.ρ. κεηαβιεηέο). Δελ κπνξείηε λα δειώζεηε θαηαζθεπαζηέο ζε κία δηαζύλδεζε. Όιεο νη κέζνδνη πνπ δειώλεηε ζε κία δηαζύλδεζε είλαη εμ νξηζκνύ δεκόζηεο (public). Γη απηό θαη δελ κπνξείηε λα δειώζεηε πξνζδηνξηζηέο πξόζβαζεο γηα ηηο κεζόδνπο κηαο δηαζύλδεζεο. Μία δηαζύλδεζε δελ κπνξεί λα είλαη παξάγωγε θιάζεο ή δνκήο. Παξόια απηά κία δηαζύλδεζε κπνξεί λα είλαη παξάγωγε δηαζύλδεζε κηαο άιιεο δηαζύλδεζεο βάζεο.
Αφαιρετικές (abstract) κλάσεις Κάηη πνπ ζπκβαίλεη αξθεηά ζπρλά ζε ηεξαξρίεο θιάζεωλ είλαη λα δειώλνπκε θάπνηεο γεληθέο θιάζεηο βάζεο θαη νη παξάγωγεο θιάζεηο πνπ επεθηείλνπλ ηηο θιάζεηο βάζεο λα θιεξνλνκνύλ όια ηα κέιε θαη ηηο κεζόδνπο ηνπο. Οη παξάγωγεο θιάζεηο κπνξνύλ λα επεθηείλνπλ ηηο θιάζεηο βάζεο ηνπο πξνζζέηνληαο θαηλνύξγηα κέιε δεδνκέλωλ θαη κεζόδνπο. Σε έλα ηέηνην ζελάξην είλαη πηζαλόλ λα ππάξρεη θάπνηα κέζνδνο ζηελ θιάζε βάζεο ε νπνία δελ κπνξεί λα νξηζηεί ζε απηήλ αιιά κόλν λα δειωζεί. Δειαδή, ελώ κπνξνύκε λα πνύκε πωο ζα είλαη απηή ε κέζνδνο (ηύπνο επηζηξνθήο, όλνκα, ιίζηα παξακέηξωλ), ε ιεηηνπξγία ηεο ζηηο παξάγωγεο θιάζεηο ζα είλαη ηόζν δηαθνξεηηθή πνπ δελ έρεη λόεκα ε παξνρή θάπνηαο εμ νξηζκνύ ιεηηνπξγίαο. Αλ ζ' απηό ην ζελάξην, πξνζζέζνπκε θαη ηελ επηζπκία λα κελ κπνξεί θαλείο λα δεκηνπξγήζεη αληηθείκελα απηήο ηεο θιάζεο βάζεο ηόηε νδεγνύκαζηε ζηηο αθαηξεηηθέο (abstract) θιάζεηο θαη κεζόδνπο.
Παράδειγμα Abstract κλάσεων Φαληαζηείηε γηα παξάδεηγκα κία θιάζε Shape (ζρήκα) ελόο ζρεδηαζηηθνύ πξνγξάκκαηνο. Όια ηα ζρήκαηα έρνπλ έλα ζεκείν πνπ ζεωξείηαη ην θέληξν ηνπο. Επνκέλωο είλαη ινγηθό λα έρνπκε κία ηδηόηεηα center κε ηελ αληίζηνηρε πινπνίεζε (set θαη get). Παξόια απηά ε κέζνδνο ζρεδίαζεο, draw, ελώ ζα ππάξρεη γηα όια ηα ζρήκαηα δελ κπνξεί λα νξηζηεί κε αθξίβεηα ζηε θιάζε βάζεο γηαηί νη εληνιέο ζρεδίαζεο θάζε ζρήκαηνο δηαθέξνπλ αλάινγα κε ην ζρήκα. Επηπιένλ ζην πξόγξακκά καο δελ ζα είρε λόεκα λα δεκηνπξγήζνπκε έλα αληηθείκελν Shape, κηα θαη έλα ζρήκα ζα πξέπεη λα είλαη θάηη ζπγθεθξηκέλν (π.ρ. Circle, Line θιπ.)
Παράδειγμα: Η κλάση Point namespace AbstractClassesExample1 class Point private int x, y; public Point(int x, int y) this.x = x; this.y = y; public int X get return x; public int Y get return y;
Παράδειγμα: Η κλάση Shape namespace AbstractClassesExample1 abstract class Shape private Point center; public Point Center set this.center = value; get return this.center; abstract public void draw(); Η θιάζε Shape είλαη αθαηρεηηθή. Εποκέλως ζα πρέπεη λα ηελ δειώζεηε ως abstract. Επίζες ζα πρέπεη λα δειώζεηε ως abstract θαη ηης κεζόδοσς γηα ηης οποίες δελ παρέτεηε σιοποίεζε. Οη παράγωγες θιάζεης ηες Shape ζα θιερολοκήζοσλ ηα ζηοητεία ποσ σιοποηούληαη (γηα παράδεηγκα ηελ ηδηόηεηα Center), αιιά ζα πρέπεη λα σιοποηήζοσλ ηης αθαηρεηηθές κεζόδοσς, όπως ε draw().
Παράδειγμα: Η κλάση Circle using System; namespace AbstractClassesExample1 class Circle : Shape public override void draw() Console.WriteLine("Υινπνίεζε ηεο draw γηα ηνπο θύθινπο"); Η θιάζε Circle είλαη παράγωγε ηες αθαηρεηηθής θιάζες Shape θαη ζα πρέπεη λα ορίζεη ηελ σιοποίεζε ηες αθαηρεηηθής κεζόδοσ draw. Δελ τρεηάδεηαη όκως λα ορίζεη εθ λέοσ ηο θέληρο (ηελ ηδηόηεηα Center) γηαηί ασηήλ θιερολοκείηαη από ηελ θιάζε βάζες Shape.
Παράδειγμα: Η κλάση Line using System; namespace AbstractClassesExample1 class Line : Shape public override void draw() Console.WriteLine("Υινπνίεζε ηεο draw γηα ηηο γξακκέο"); Η θιάζε Line είλαη επίζες παράγωγε ηες αθαηρεηηθής θιάζες Shape θαη ζα πρέπεη λα ορίζεη ηελ σιοποίεζε ηες αθαηρεηηθής κεζόδοσ draw γηα ηης γρακκές. Επίζες δελ τρεηάδεηαη λα ορίζεη εθ λέοσ ηο θέληρο (ηελ ηδηόηεηα Center) γηαηί ασηήλ θιερολοκείηαη από ηελ θιάζε βάζες Shape.
Παράδειγμα χρήσης των κλάσεων using System; namespace AbstractClassesExample1 class Program static void Main(string[] args) Shape s1 = new Circle(); s1.center = new Point(10, 10); Console.WriteLine("Τν θέληξν ηνπ θύθινπ είλαη: (x, y) = (0, 1)", s1.center.x, s1.center.y); s1.draw(); Shape s2 = new Line(); s2.center = new Point(3, 7); Console.WriteLine("Τν θέληξν ηεο γξακκήο είλαη: (x, y) = (0, 1)", s2.center.x, s2.center.y); s2.draw(); Console.ReadKey();
Περιορισμοί των αφαιρετικών κλάσεων Όπωο θαη κε ηηο δηαζπλδέζεηο δελ κπνξείηε λα δεκηνπξγήζεηε ζηηγκηόηππα αθαηξεηηθώλ θιάζεωλ. Όιεο νη αθαηξεηηθέο κέζνδνη κηαο αθαηξεηηθήο θιάζεο ζα πξέπεη ππνρξεωηηθά λα είλαη δεκόζηεο.
Σφραγισμένες κλάσεις Αλ δελ ζέινπκε κία θιάζε λα κπνξεί λα ρξεζηκνπνηεζεί ωο θιάζε βάζεο ζε κία ηεξαξρία θιάζεωλ, ηόηε ηελ δειώλνπκε ωο ζθξαγηζκέλε (sealed). Γηα παξάδεηγκα: // Σθξαγηζκέλε θιάζε. Δελ κπνξεί λα επεθηαζεί. sealed class SealedClassExample public int Add(int x, int y) return x + y;
Περίληψη #1 Εργαζία Πωο δεκηνπξγνύκε κία δηαζύλδεζε Πωο πινπνηνύκε κία δηαζύλδεζε Τη πρέπεη λα θάλω Φξεζηκνπνηνύκε ηελ ιέμε-θιεηδί interface. Γηα παξάδεηγκα: interface IDemo string Name(); string Description(); Δειώλνπκε κία θιάζε πνπ πινπνηεί ηελ δηαζύλδεζε κε ηνλ ίδην ηξόπν πνπ δειώλνπκε πωο κία θιάζε είλαη παξάγωγε κηαο θιάζεο βάζεο. Υινπνηνύκε όιεο ηηο κεζόδνπο ηεο δηαζύλδεζεο. Γηα παξάδεηγκα: class Test : IDemo public string IDemo.Name() public string IDemo.Description()..
Περίληψη #2 Εργαζία Πωο δειώλνπκε κία αθαηξεηηθή θιάζε Πωο ρξεζηκνπνηνύκε κία αθαηξεηηθή θιάζε ωο θιάζε βάζεο κηαο παξάγωγεο θιάζεο. Τη πρέπεη λα θάλω Δειώλνπκε κία θιάζε ρξεζηκνπνηώληαο ηελ ιέμε-θιεηδί abstract. Γηα θάζε αθαηξεηηθή κέζνδν επίζεο ρξεζηκνπνηνύκε ηελ ιέμε-θιεηδί abstract. Γηα παξάδεηγκα: abstract class GrazingMammal abstract public void DigestGrass();... Επεθηείλνπκε ηελ αθαηξεηηθή θιάζε ωο ζπλήζωο. Θα πξέπεη ππνρξεωηηθά λα πινπνηήζνπκε ηηο αθαηξεηηθέο κεζόδνπο ηεο θιάζεο βάζεο. Γηα παξάδεηγκα: public class Horse : GrazingMammal public void DigestGrass() //σιοποίεζε ηες DigestGrass
Περίληψη #3 Εργαζία Πωο δειώλνπκε κία θιάζε πνπ δελ κπνξεί λα επεθηαζεί από κία παξάγωγε θιάζε Τη πρέπεη λα θάλω Τελ δειώλνπκε ωο ζθξαγηζκέλε (sealed). Γηα παξάδεηγκα: sealed class SealedClassExample public int Add(int x, int y) return x + y;
Ερωτήσεις;