Sobes.tech
Middle

Ποια είναι τα διαφορές μεταξύ μιας αφηρημένης κλάσης και ενός mixin στη Dart;

sobes.tech AI

Απάντηση από AI

Αφηρημένη κλάση:

  • Δεν μπορεί να δημιουργηθεί άμεσα.
  • Μπορεί να περιέχει αφηρημένες μεθόδους (χωρίς υλοποίηση) και υλοποιημένες μεθόδους.
  • Οι κλάσεις κληρονομούν από μια αφηρημένη κλάση με τη λέξη-κλειδί extends.
  • Μια κλάση μπορεί να κληρονομήσει μόνο από μια κλάση (μονογονική κληρονομιά).

Mixin:

  • Δεν μπορεί να δημιουργηθεί άμεσα.
  • Δεν μπορεί να έχει κατασκευαστές.
  • Μπορεί να περιέχει υλοποιημένες μεθόδους, αλλά όχι αφηρημένες (μέχρι το Dart 2.1, όπου εμφανίστηκαν τα αφηρημένα mixins).
  • Οι κλάσεις χρησιμοποιούν τη λειτουργικότητα των mixins με τη λέξη-κλειδί with.
  • Μια κλάση μπορεί να χρησιμοποιεί πολλά mixins.
  • Χρησιμοποιείται για την επανάχρηση κώδικα και την προσθήκη λειτουργικότητας στις κλάσεις χωρίς κληρονομικότητα. Ουσιαστικά, επιτρέπει το "μείγμα" συμπεριφορών.

Παράδειγμα αφηρημένης κλάσης:

abstract class Animal {
  void makeSound(); // Αφηρημένη μέθοδος
  void eat() {
    print('Τρώγοντας...');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Γουφ!');
  }
}

Παράδειγμα mixin:

mixin CanJump {
  void jump() {
    print('Πηδάει!');
  }
}

class Cat with CanJump { }

Σύγκριση σε μορφή πίνακα:

Χαρακτηριστικό Αφηρημένη κλάση Mixin
Δημιουργία αντικειμένου Όχι Όχι
Κατασκευαστής Μπορεί να έχει Δεν μπορεί να έχει
Αφηρημένες μέθοδοι Μπορεί να έχει Δεν μπορεί να έχει (μέχρι Dart 2.1)
Υλοποιημένες μέθοδοι Μπορεί να έχει Μπορεί να έχει
Χρήση extends with
Κληρονομικότητα/Χρήση Μονογονική κληρονομιά Πολλαπλή χρήση
Σκοπός Ορισμός γενικού συμβολαίου Επανάχρηση κώδικα, προσθήκη συμπεριφορών