【发布时间】:2018-02-04 16:17:03
【问题描述】:
我对接口和抽象类的概念非常熟悉,但对mixins的概念不是很熟悉。
现在,在 Dart 中,每个类 A 都定义了一个隐式接口,可以通过使用 implements 关键字由另一个类 B 实现。没有明确的方式来声明接口,例如在 Java 中,接口只包含未实现的方法(以及最终的静态变量)。在 Dart 中,由于接口是由类定义的,所以接口A 的方法实际上可能已经实现了,但是实现B 的类仍然需要重写这些实现。
我们可以从下面这段代码中看出这种情况:
class A {
void m() {
print("method m");
}
}
// LINTER ERROR: Missing concrete implementation of A.m
// Try implementing missing method or make B abstract.
class B implements A {
}
在 Dart 中,mixin 也是通过普通的类声明来定义的...
...原则上,每个类都定义了一个可以从中提取的mixin。然而,在这个提议中,mixin 只能从没有声明构造函数的类中提取。这种限制避免了由于需要将构造函数参数向上传递到继承链而出现的复杂情况。
mixin 基本上是一个可以定义未实现或已实现方法的类。这是一种向另一个类添加方法而无需在逻辑上使用继承的方法。在 Dart 中,mixin 应用于超类,通过“正常”继承进行扩展,如下例所示:
class A {
void m() {
print("method m");
}
}
class MyMixin {
void f(){
print("method f");
}
}
class B extends A with MyMixin {
}
在这种情况下,我们应该注意到B 不必同时实现A 和MyMixin 的任何其他方法。
将 mixin 应用到类和从类继承之间有明显的区别,至少在只支持单父继承的语言中,因为在这种情况下,我们可以应用许多mixins 到一个类,但是一个类可以从另一个类继承。
实现接口和从类继承之间也有明显的区别。实现接口的类需要强制实现接口定义的所有方法。
所以,总而言之,实现接口的概念更多是关于与实现接口的类建立契约,而mixin的概念(顾名思义)更多是关于重用代码(不重复继承层次结构)。
在 Dart 中何时使用 mixins 以及何时使用接口?在设计软件时,是否有一些经验法则至少适用于特殊的循环模式,最好定义一个 mixin 并将其应用于超类,而不是让我们的类实现一个接口?我会欣赏在接口和 mixin 都可以使用的上下文中的设计决策的具体示例,但其中一个被用于另一个(出于某种原因)。
【问题讨论】:
标签: oop interface dart abstract-class mixins