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 {}

 

posted @ 2022-04-27 14:32  rogerwu  阅读(185)  评论(0编辑  收藏  举报