Dart 类与对象 -- 接口和混入
Dart 类与对象 - 接口
接口在 Dart 中就是一个类(只是用法不同)
与Java不同,Java中的接口需要用 interface 关键字声明,Dart 中不需要
接口可以是任意类,但一般使用抽象类做接口
一个类可以 实现(implements)多个接口,多个接口用逗号分隔
class MyClass implements Interface1, Interface2 {...}
接口可以看成一个个小零件,类实现接口就相当于组装零件
普通类实现接口后,必须重写接口中所有的属性和方法
// 手机处理器 abstract class Processor { String cores; // 内核:2核,4核 arch(String name); // 芯片制程:7nm, 5nm } // 手机摄像头 abstract class Camera { String resolution; // 分辨率:1000万,3000万 brand(String name); // 品牌:三星,徕卡,蔡司 } // 通过普通类实现接口 class Phone implements Processor, Camera { @override String cores; @override String resolution; Phone(this.cores, this.resolution); @override arch(String name) { print('芯片制程:$name'); } @override brand(String name) { print('相机品牌:$name'); } } void main() { Phone p = new Phone('4核', '4800万'); p.arch('5nm'); // 芯片制程:5nm p.brand('蔡司'); // 相机品牌:蔡司 }
Dart 类与对象 - 混入(Mixin)
混入(Mixin)是一段公共代码,混入有两种声明方式:
(1)、把类用作混入,如:class MixinA {...}
作为 Mixin 的类只能继承自 Object,不能继承其它类
作为 Mixin 的类不能有构造函数
(2)、使用 mixin 关键字声明,如:mixin MixinB {...}
混入(Mixin)可以提高代码复用的效率,普通类可以通过 with 来使用混入,如:
class MyClass with MixinA, MixinB {...}
使用多个混入时,后引入的混入会覆盖先引入的混入中的重复内容,如:
MixinA 和 MixinB 中都有 hello() 方法,MyClass 会使用MixinB中的
class MixinA { String name = 'MixinA'; void printA() { print('A'); } void run() { print('A is running'); } } mixin MixinB { String name = 'MixinB'; void printB() { print('B'); } void run() { print('B is running'); } } class MyClass with MixinA, MixinB {} void main() { var c = new MyClass(); c.printA(); // A c.printB(); // B // 后引入的混入,会覆盖之前引入的混入中重复的内容 print(c.name); // MixinB c.run(); // B is running }
作为 Mixin 的类只能继承自 Object,不能继承其它类
class Base { } class MixinA extends Base { String name = 'MixinA'; void printA() { print('A'); } void run() { print('A is running'); } } // Error: The class 'MixinA' can't be used as a mixin because it extends a class other than 'Object' class MyClass with MixinA, MixinB {}
class MixinA extends Object { String name = 'MixinA'; void printA() { print('A'); } void run() { print('A is running'); } } // Ok class MyClass with MixinA, MixinB {}
作为 Mixin 的类不能有构造函数
class MixinA extends Object { String name = 'MixinA'; // 尝试在混入类中声明一个构造函数 MixinA(this.name); void printA() { print('A'); } void run() { print('A is running'); } } // Error: The class 'MixinA' can't be used as a mixin because it declares a constructor class MyClass with MixinA, MixinB {}