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