Ποια είναι η ομοιότητα και η διαφορά μεταξύ μιας κανονικής και μιας αφηρημένης κλάσης;
sobes.tech AI
Απάντηση από AI
Στο Golang, δεν υπάρχει η έννοια της "κανονικής κλάσης" και της "αφηρημένης κλάσης" με την μορφή που υπάρχουν σε αντικειμενοστραφή γλώσσες όπως η Java ή η C#.
Ωστόσο, η λειτουργικότητά τους μπορεί να μιμηθεί χρησιμοποιώντας δομές και διεπαφές.
Ομοιότητες (χρησιμοποιώντας δομές και διεπαφές στο Golang):
- Κατάσταση (δεδομένα): Η δομή μπορεί να περιέχει πεδία, όπως μια κανονική κλάση που αποθηκεύει ιδιότητες.
- Συμπεριφορά (μέθοδοι): Μπορούν να προσαρτηθούν μέθοδοι στη δομή, που θα ορίζουν τη συμπεριφορά της, παρόμοια με τις μεθόδους μιας κανονικής κλάσης.
- Κοινό συμβόλαιο (για αφηρημένη κλάση και διεπαφή): Η διεπαφή στο Golang ορίζει ένα σύνολο μεθόδων που κάθε "υλοποιώντας" αυτή τη διεπαφή δομή πρέπει να υλοποιεί. Αυτό μοιάζει με το πώς μια αφηρημένη κλάση ή διεπαφή σε άλλες γλώσσες ορίζει ένα συμβόλαιο για τις κλάσεις που κληρονομούν ή υλοποιούν.
Διαφορές (στο πλαίσιο του Golang):
| Χαρακτηριστικό | "Κανονική κλάση" (δομή με μεθόδους) | "Αφηρημένη κλάση" (διεπαφή + δομές) |
|---|---|---|
| Άμεση δημιουργία | Μπορεί να δημιουργηθεί ένα παράδειγμα της δομής. | Δεν μπορεί να δημιουργηθεί ένα παράδειγμα της διεπαφής. |
| Υλοποίηση μεθόδων | Όλες οι μέθοδοι που προσαρτώνται στη δομή έχουν υλοποίηση. | Η διεπαφή δηλώνει μόνο μεθόδους, αλλά όχι την υλοποίησή τους. |
| Κληρονομικότητα | Δεν υπάρχει κληρονομικότητα με την κλασική έννοια. Μπορεί να χρησιμοποιηθεί σύνθεση (ενσωμάτωση δομών). | Η διεπαφή δεν κληρονομεί, αλλά υλοποιείται από δομές. |
| Υποχρέωση υλοποίησης | Δεν υπάρχει υποχρέωση υλοποίησης συγκεκριμένου συνόλου μεθόδων, εκτός αυτών που προσαρτώνται στη δομή. | Κάθε δομή που "υλοποιεί" τη διεπαφή Golang πρέπει να παρέχει υλοποίηση όλων των μεθόδων της. |
| Αποθήκευση κατάστασης (πεδία) | Η δομή μπορεί να περιέχει πεδία δεδομένων. | Η διεπαφή δεν περιέχει πεδία δεδομένων. |
Παράδειγμα μίμησης:
// διεπαφή που μιμείται μια αφηρημένη κλάση
type Shape interface {
Area() float64
Perimeter() float64
}
// δομή που μιμείται μια κανονική κλάση
type Circle struct {
Radius float64
}
// υλοποίηση των μεθόδων της διεπαφής για το Circle
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// Άλλη δομή που υλοποιεί τη διεπαφή
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
Σε αυτό το παράδειγμα, το Shape λειτουργεί ως συμβόλαιο (παρόμοιο με αφηρημένη κλάση ή διεπαφή σε άλλες γλώσσες), και το Circle και το Rectangle είναι συγκεκριμένες υλοποιήσεις (ανάλογες με κανονικές κλάσεις). Μπορούμε να δημιουργήσουμε παραδείγματα Circle και Rectangle, αλλά δεν μπορούμε να δημιουργήσουμε άμεσα ένα παράδειγμα Shape. Επιπλέον, και οι δύο δομές πρέπει να υλοποιούν τις μεθόδους Area() και Perimeter() για να "εκπληρώσουν" τη διεπαφή Shape.