Middle
Jaké jsou rozdíly mezi abstraktní třídou a mixinem v Dart?
sobes.tech AI
Odpověď od AI
Abstraktní třída:
- Nemůže být přímo instancována.
- Může obsahovat abstraktní (bez implementace) a implementované metody.
- Třídy dědí od abstraktní třídy pomocí klíčového slova
extends. - Třída může dědit pouze od jedné třídy (jednoduché dědění).
Mixin:
- Nemůže být přímo instancován.
- Nemůže mít konstruktory.
- Může obsahovat implementované metody, ale nemůže mít abstraktní metody (až do Dart 2.1, kdy se objevily abstraktní mixiny).
- Třídy používají funkčnost mixinů pomocí klíčového slova
with. - Třída může používat více mixinů.
- Používá se k opětovnému použití kódu a přidání funkčnosti třídám bez dědičnosti. V podstatě umožňuje "míchat" chování.
Příklad abstraktní třídy:
abstract class Animal {
void makeSound(); // Abstraktní metoda
void eat() {
print('Jídlo...');
}
}
class Dog extends Animal {
@override
void makeSound() {
print('Haf!');
}
}
Příklad mixinu:
mixin CanJump {
void jump() {
print('Skáče!');
}
}
class Cat with CanJump { }
Porovnání v tabulkové podobě:
| Vlastnost | Abstraktní třída | Mixin |
|---|---|---|
| Instancování | Ne | Ne |
| Konstruktor | Může mít | Nemůže mít |
| Abstraktní metody | Může mít | Nemůže mít (až do Dart 2.1) |
| Implementované metody | Může mít | Může mít |
| Použití | extends |
with |
| Dědění/použití | Jednoduché dědění | Vícenásobné použití |
| Účel | Definice obecného kontraktu | Opětovné použití kódu, přidání chování |