class Television { void turnOn() { _illuminateDisplay(); _activateIrSensor(); } // ... } class SmartTelevision extends Television { void turnOn() { super.turnOn(); _bootNetworkInterface(); _initializeMemory(); _upgradeApps(); } // ... }
子类可以重载实例方法, getters 方法, setters 方法。下面是个关于重写 Object 类的方法 noSuchMethod() 的例子,当代码企图用不存在的方法或实例变量时,这个方法会被调用。
class A { // 如果你不重写 noSuchMethod 方法, 就用一个不存在的成员,会导致NoSuchMethodError 错误。 void noSuchMethod(Invocation mirror) { print('You tried to use a non-existent member:' + '${mirror.memberName}'); } }
你可以使用 @override 注释来表明你重写了一个成员。
class A { @override void noSuchMethod(Invocation mirror) { // ... } }
如果你用 noSuchMethod() 实现每一个可能的 getter 方法,setter 方法和类的方法,那么你可以使用 @proxy 标注来避免警告。
@proxy class A { void noSuchMethod(Invocation mirror) { // ... } }
库和可见性
import,part,library指令可以帮助创建一个模块化的,可共享的代码库。库不仅提供了API,还提供隐私单元:以下划线(_)开头的标识符只对内部库可见。每个Dartapp就是一个库,即使它不使用库指令。
库可以分布式使用包。见 Pub Package and Asset Manager 中有关pub(SDK中的一个包管理器)。
使用库
使用 import 来指定如何从一个库命名空间用于其他库的范围。
使用 import 来指定如何从一个库命名空间用于其他库的范围。
import 'dart:html';
唯一需要 import 的参数是一个指向库的 URI。对于内置库,URI中具有特殊dart:scheme。对于其他库,你可以使用文件系统路径或package:scheme。包 package:scheme specifies libraries ,如pub工具提供的软件包管理器库。例如:
import 'dart:io'; import 'package:mylib/mylib.dart'; import 'package:utils/utils.dart';
指定库前缀
如果导入两个库是有冲突的标识符,那么你可以指定一个或两个库的前缀。例如,如果 library1 和 library2 都有一个元素类,那么你可能有这样的代码:
import 'package:lib1/lib1.dart'; import 'package:lib2/lib2.dart' as lib2; // ... var element1 = new Element(); // 使用lib1里的元素 var element2 = new lib2.Element(); // 使用lib2里的元素
导入部分库
如果想使用的库一部分,你可以选择性导入库。例如:
// 只导入foo库 import 'package:lib1/lib1.dart' show foo; //导入所有除了foo import 'package:lib2/lib2.dart' hide foo;
延迟加载库 * 延迟(deferred)加载(也称为延迟(lazy)加载)允许应用程序按需加载库。下面是当你可能会使用延迟加载某些情况:
为了减少应用程序的初始启动时间;
执行A / B测试-尝试的算法的替代实施方式中;
加载很少使用的功能,例如可选的屏幕和对话框。
* 为了延迟加载一个库,你必须使用 deferred as 先导入它。 ``` dart import 'package:deferred/hello.dart' deferred as hello; ``` * 当需要库时,使用该库的调用标识符调用 LoadLibrary()。 ``` dart greet() async { await hello.loadLibrary(); hello.printGreeting(); } ``` * 在前面的代码,在库加载好之前,await关键字都是暂停执行的。有关 async 和 await 见 asynchrony support 的更多信息。 您可以在一个库调用 LoadLibrary() 多次都没有问题。该库也只被加载一次。 * 当您使用延迟加载,请记住以下内容: * 延迟库的常量在其作为导入文件时不是常量。记住,这些常量不存在,直到迟库被加载完成。 * 你不能在导入文件中使用延迟库常量的类型。相反,考虑将接口类型移到同时由延迟库和导入文件导入的库。 * Dart隐含调用LoadLibrary()插入到定义deferred as namespace。在调用LoadLibrary()函数返回一个Future。
库的实现