Sobes.tech
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í