Middle
Na czym polegają różnice między klasą abstrakcyjną a mixinem w Dart?
sobes.tech AI
Odpowiedź od AI
Klasa abstrakcyjna:
- Nie może być bezpośrednio instancjonowana.
- Może zawierać metody abstrakcyjne (bez implementacji) i zaimplementowane metody.
- Klasy dziedziczą po klasie abstrakcyjnej za pomocą słowa kluczowego
extends. - Klasa może dziedziczyć tylko po jednej klasie (dziedziczenie pojedyncze).
Mixin:
- Nie może być bezpośrednio instancjonowany.
- Nie może mieć konstruktorów.
- Może zawierać zaimplementowane metody, ale nie może mieć metod abstrakcyjnych (do Dart 2.1, gdzie pojawiły się abstrakcyjne mixiny).
- Klasy korzystają z funkcjonalności mixinów za pomocą słowa kluczowego
with. - Klasa może korzystać z wielu mixinów.
- Służy do ponownego użycia kodu i dodawania funkcjonalności do klas bez dziedziczenia. W istocie, pozwala "mieszać" zachowania.
Przykład klasy abstrakcyjnej:
abstract class Animal {
void makeSound(); // Metoda abstrakcyjna
void eat() {
print('Jedzenie...');
}
}
class Dog extends Animal {
@override
void makeSound() {
print('Hau!');
}
}
Przykład mixinu:
mixin CanJump {
void jump() {
print('Skacząc!');
}
}
class Cat with CanJump { }
Porównanie w formie tabeli:
| Cecha | Klasa abstrakcyjna | Mixin |
|---|---|---|
| Tworzenie instancji | Nie | Nie |
| Konstruktor | Może mieć | Nie może mieć |
| Metody abstrakcyjne | Może mieć | Nie może mieć (do Dart 2.1) |
| Metody zaimplementowane | Może mieć | Może mieć |
| Użycie | extends |
with |
| Dziedziczenie/użycie | Dziedziczenie pojedyncze | Użycie wielokrotne |
| Cel | Definicja ogólnego kontraktu | Ponowne użycie kodu, dodanie zachowania |