Разъяснения по миксинам и реализациям в Dart - PullRequest
0 голосов
/ 20 марта 2019

В этой статье о Dart Mixins внизу есть пример:

class S {
  twice(int x) => 2 * x;
}

abstract class I {
   twice(x);
}

abstract class J {
   thrice(x);
}
class K extends S implements I, J {
  int thrice(x) => 3* x;
}

class B {
  twice(x) => x + x;
}
class A = B with K;

В статье говорится:

Теперь, когда мы определим A, мы получим реализацию thrice () из K's Mixin. Тем не менее, миксин не даст нам реализацию дважды(). К счастью, B имеет такую ​​реализацию, поэтому в целом A удовлетворяет требованиям I, J, а также S.

Я не понимаю , почему B необходимо реализовать twice. Почему реализация K thrice применяется к B, а ее унаследованная реализация twice - нет?

1 Ответ

1 голос
/ 20 марта 2019

(Обратите внимание, что связанная статья устарела и не относится к Dart 2.)

Идея миксинов заключается в том, что «миксин» - это разница между классом и его суперклассом.

Для класса K это различие - все в его сокращении после предложения extends:

                 implements I, J {
  int thrice(x) => 3* x;
}

Когда вы затем создаете новый класс A, применяя этот миксин к другому классу, B, как class A = B with K;, тогда результирующий класс становится по существу:

class A extends B implements I, J {
  int thrice(x) => 3* x;
}

Этот класс реализует интерфейсы I и J и имеет метод twice, унаследованный от B, и метод thrice, смешанный с K.

(Этот пример недопустим в Dart 2. В Dart 2 вы не можете извлечь интерфейс из объявления класса с суперклассом, отличным от Object. Чтобы объявить миксин, который имеет понятие суперкласса, Вы должны использовать объявление mixin:

mixin K on S implements I, J {
  int thrice(int x) => 3* x;
}

class B implements S {
  int twice(int x) => 2 * x;
}

class A = B with K; 

).

...