【问题标题】:Clarification on mixins and implementations in Dart澄清 Dart 中的 mixins 和实现
【发布时间】:2019-03-20 10:32:17
【问题描述】:

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;

文章接着说:

现在当我们定义 A 时,我们从 K 中得到 thrice() 的实现 混音。但是,mixin 不会为我们提供 两次()。幸运的是,B 确实有这样的实现,所以总体 A 确实满足I、J和S的要求。

我不明白 为什么 B 需要实现 twice。为什么Kthrice 实现适用于B,但其继承的twice 实现却没有?

【问题讨论】:

  • 我不认为它需要来实现它。你试过删除它吗?我认为是为了演示实际执行的是哪个实现。
  • "但是,mixin 不会为我们提供 two() 的实现。" - 在链接的文章中有详细说明
  • 我用更多信息编辑了我的问题
  • 文本已过期。您不能在 Dart 2 中将 K 用作 mixin。在 Dart 1 中,从具有除 Object 之外的超类的类派生的 mixin,如 K,将仅包含成员已声明在那个类中,所以只有thrice的声明,而不是从S继承的twiceA类是那个mixin对BB with K的mixin应用,它扩展了B K 扩展其超类的同一类主体(并且还需要 B 来实现 S,因此这也不是有效的 Dart 1)。结果将是来自Btwice 和来自Kthrice

标签: dart mixins


【解决方案1】:

(请注意,链接的文章已过时,不适用于 Dart 2。)

mixin 背后的理念是“mixin”是一个类和它的超类之间的区别。

对于K 类,区别在于它在extends 子句之后的声明中的所有内容:

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

然后,当您通过将该 mixin 应用到不同的类 B 来创建一个新类 A 时,就像 class A = B with K; 那样,生成的类本质上就变成了:

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

这个类实现了接口IJ,并有一个继承自Btwice方法和一个混合自Kthrice方法。

(此示例无效 Dart 2。在 Dart 2 中,您不能从具有Object 以外的超类的类声明中提取接口。要声明具有超类概念的 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; 

)。

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2016-05-30
    • 2021-12-06
    • 2013-12-06
    • 1970-01-01
    • 2023-04-07
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多