澄清 Dart 中的混合和实现
Clarification on mixins and implementations in Dart
在this article about 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;
文章接着说:
Now when we define A, we get the implementation of thrice() from K’s
mixin. However, the mixin won’t provide us with an implementation of
twice(). Fortunately, B does have such an implementation, so overall A
does satisfy the requirements of I, J as well as S.
我不明白为什么 B
需要实施twice
。为什么 K
的 thrice
实现应用于 B
而其继承的 twice
实现却没有?
(请注意,链接的文章已过时,不适用于 Dart 2。)
mixins 背后的想法是 "a mixin" 是 class 和它的超级 class 之间的区别。
对于 class K
,区别在于它在扩展子句之后的声明中的所有内容:
implements I, J {
int thrice(x) => 3* x;
}
然后,当您通过将该混合应用到不同的 class、B
来创建新的 class A
时,如 class A = B with K;
那么结果 class 本质上变成了:
class A extends B implements I, J {
int thrice(x) => 3* x;
}
这个class实现了接口I
和J
,并且有一个twice
方法继承自B
和一个thrice
方法混入 K
.
(这个例子在 Dart 2 中是无效的。在 Dart 2 中,你不能从一个 class 声明中提取一个接口,除了 Object
之外还有一个超 class。要声明具有超级 class 概念的 mixin,您必须使用 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;
).
在this article about 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;
文章接着说:
Now when we define A, we get the implementation of thrice() from K’s mixin. However, the mixin won’t provide us with an implementation of twice(). Fortunately, B does have such an implementation, so overall A does satisfy the requirements of I, J as well as S.
我不明白为什么 B
需要实施twice
。为什么 K
的 thrice
实现应用于 B
而其继承的 twice
实现却没有?
(请注意,链接的文章已过时,不适用于 Dart 2。)
mixins 背后的想法是 "a mixin" 是 class 和它的超级 class 之间的区别。
对于 class K
,区别在于它在扩展子句之后的声明中的所有内容:
implements I, J {
int thrice(x) => 3* x;
}
然后,当您通过将该混合应用到不同的 class、B
来创建新的 class A
时,如 class A = B with K;
那么结果 class 本质上变成了:
class A extends B implements I, J {
int thrice(x) => 3* x;
}
这个class实现了接口I
和J
,并且有一个twice
方法继承自B
和一个thrice
方法混入 K
.
(这个例子在 Dart 2 中是无效的。在 Dart 2 中,你不能从一个 class 声明中提取一个接口,除了 Object
之外还有一个超 class。要声明具有超级 class 概念的 mixin,您必须使用 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;
).