美文网首页
Dart 笔记 9 - 类(2)

Dart 笔记 9 - 类(2)

作者: 三流之路 | 来源:发表于2019-01-15 18:34 被阅读0次

抽象类

加 abstract 关键字,抽象方法没有实现体,不需要 abstract 关键字。

abstract class Doer {
  void doSomething(); 
}

class EffectiveDoer extends Doer {
  void doSomething() {
  }
}

隐式接口

每个类都隐式地定义一个接口,该接口包含类的所有实例成员及其实现的任何接口。如果想创建一个类 A,它支持类 B 的 API 而不继承 B 的实现,那么类 A 应该实现 B 接口。

// 有个隐式的接口,包含实例方法 greet().
class Person {
  // In the interface, but visible only in this library.
  final _name;

  // 构造方法不在隐式接口里
  Person(this._name);

  // 在隐式接口里
  String greet(String who) => 'Hello, $who. I am $_name.';
}

// 用实现而不是继承
class Impostor implements Person {
  get _name => '';
  
  // 如果继承必须要有构造方法
  // 实现必须重写 greet 方法
  String greet(String who) => 'Hi $who. Do you know who I am?';
}

String greetBob(Person person) => person.greet('Bob');

void main() {
  print(greetBob(Person('Kathy'))); // Hello, Bob. I am Kathy.
  print(greetBob(Impostor())); // Hi Bob. Do you know who I am?
}

重写方法

子类可以覆盖实例方法、getter 和 setter。可以使用 @override 注解来指示重写了某个成员方法。

class Television {
  void turnOn() {
    _illuminateDisplay();
    _activateIrSensor();
  }
  // ···
}

class SmartTelevision extends Television {
  // 重写方法
  void turnOn() {
    super.turnOn(); // 使用 super 表示父类的方法
    _bootNetworkInterface();
    _initializeMemory();
    _upgradeApps();
  }
  // ···
}

重写操作符

可以重写这些操作符:<+|[]>/^[]=<=~/&~>=*<<==-%>>。类似 Kotlin。

class Vector {
  final int x, y;

  Vector(this.x, this.y);

  Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
  Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
}

void main() {
  final v = Vector(2, 3);
  final w = Vector(2, 2);

  assert(v + w == Vector(4, 5));
  assert(v - w == Vector(0, 1));
}

如果重写 ==,还应该重写对象的 hashCode getter。

hashCode

每个对象自动地提供了一个整数哈希码,因此可以作为映射中的键。但是,重写 hashCode getter 来生成自定义哈希代码。如果这样做,可能还想重写 == 操作符。相等的对象必须具有相同的哈希码。

class Person {
  final String firstName, lastName;

  Person(this.firstName, this.lastName);

  @override
  int get hashCode {
    int result = 17;
    result = 37 * result + firstName.hashCode;
    result = 37 * result + lastName.hashCode;
    return result;
  }

  @override
  bool operator ==(dynamic other) {
    if (other is! Person) return false;
    Person person = other;
    return (person.firstName == firstName &&
        person.lastName == lastName);
  }
}

void main() {
  var p1 = Person('Bob', 'Smith');
  var p2 = Person('Bob', 'Smith');
  var p3 = 'not a person';
  assert(p1.hashCode == p2.hashCode);
  assert(p1 == p2);
  assert(p1 != p3);
}

noSuchMethod()

可以重写 noSuchMethod() 方法来处理程序访问一个不存在的方法或者成员变量:

class A {
  @override
  void noSuchMethod(Invocation invocation) {
    print('You tried to use a non-existent member: ' +
        '${invocation.memberName}');
  }
}

mixins 特性

mixin 类似多继承,但不是子类父类的关系,只是获取了一些功能,可以灵活地混入不同的类来实现不同的功能。相比接口,接口只是获得方法名,不包含实现,而 mixin 包含了实现。

要使用 mixin,在 with 关键字后面加上一个或多个 mixin 名称。

class Musician extends Performer with Musical {
  // ···
}

class Maestro extends Person
    with Musical, Aggressive, Demented {
  Maestro(String maestroName) {
    name = maestroName;
    canConduct = true;
  }
}

要实现 mixin,创建一个 Object 的子类,不声明构造函数,也不调用 super。例如:

abstract class Musical {
  bool canPlayPiano = false;
  bool canCompose = false;
  bool canConduct = false;

  void entertainMe() {
    if (canPlayPiano) {
      print('Playing piano');
    } else if (canConduct) {
      print('Waving hands');
    } else {
      print('Humming to self');
    }
  }
}

相关文章

  • Dart 笔记 9 - 类(2)

    抽象类 加 abstract 关键字,抽象方法没有实现体,不需要 abstract 关键字。 隐式接口 每个类都隐...

  • Dart record

    参考 Dart学习笔记(29):异步编程Dart编程字典子不语归来 的 Dart2基础何小有Dart实例教程 数组...

  • 09Dart语言基础-继承与多态

    1.继承 main.dart person.dart student.dart 2.抽象类与接口 3.Mixin混...

  • Dart9(九)抽象类、多态、 接口

    一、抽象类 1、抽象类通过abstract 关键字来定义2、dart中抽象方法不能使用abstrac声明,dart...

  • Dart 2 (七) 类

    类 Dart是一种面向对象的语言,带有类和基于mixin的继承。每个对象都是类的实例,所有类都是从对象继承而来。基...

  • Flutter/Dart - Dart中的抽象类 多态 和接口

    Dart中的抽象类 Dart中的抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口...

  • Dart 笔记 8 - 类(1)

    Dart 是一种面向对象的语言,具有类和基于 mixin 的继承。每个对象都是一个类的实例,所有的类都是 Obje...

  • Dart 笔记 10 - 类(3)

    特殊类 枚举 枚举中的每个值都有一个 index 属性,并且提供 getter 方法,它返回声明时值的索引,从 0...

  • Dart语言笔记(二)

    Dart语言笔记(一)[https://www.jianshu.com/p/7c34fb53e25a] 1.类 使...

  • event_bus 事件广播事件监听

    1. 新建一文件 EventBus.dart 2.在需要广播事件的页面引入上面的 EventBus.dart 类 ...

网友评论

      本文标题:Dart 笔记 9 - 类(2)

      本文链接:https://www.haomeiwen.com/subject/vazydqtx.html