ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 类 ``` class person { String name; } void main() { var a = new person(); //等效 var a = asd(); print(a.runtimeType); // person 获取运行时类型 print(a?.name = "cc"); //如果name 为null 则赋值 cc } ``` > 在 Dart 2 中 new 关键字变成了可选的。 ### 构造函数 ``` class person { String name; int age=0; person(String name,this.age){ //this.age 为语法糖 this.name=name; } } void main() { var a = person("cc",23); print(a.name); // cc print(a.age); // 23 } ``` > 构造函数不能够被继承 ### Getter 和 Setter ``` class person { String name; num _age = 0; person(name, this._age) { this.name = name; } num get age1 => _age + 1; num get age2 { return _age + 1; } set age3 (num a)=> _age=_age-10; } void main() { var a = person("cc", 23); print(a.age1); // 24 print(a.age2); // 24 a.age3=123; print(a.age1); // 14 } ``` ### 抽象方法 / 抽象类 实例方法, getter, 和 setter 方法可以是抽象的, 只定义接口不进行实现,而是留给其他类去实现。 抽象方法只存在于 抽象类 中。 ``` abstract class Doer { // 定义实例变量和方法 ... void doSomething(); // 定义一个抽象方法。 } class EffectiveDoer extends Doer { void doSomething() { // 提供方法实现,所以这里的方法就不是抽象方法了... } } ``` ### 扩展类(继承) 使用 extends 关键字来创建子类, 使用 super 关键字来引用父类: ``` class Television { void turnOn() { _illuminateDisplay(); _activateIrSensor(); } // ··· } class SmartTelevision extends Television { void turnOn() { super.turnOn(); _bootNetworkInterface(); _initializeMemory(); _upgradeApps(); } // ··· } ``` ### 重写类成员 ``` class SmartTelevision extends Television { @override void turnOn() {...} // ··· } ``` ### noSuchMethod() 调用不存在的方法触发 ``` class A { // 如果不重写 noSuchMethod,访问 // 不存在的实例变量时会导致 NoSuchMethodError 错误。 @override void noSuchMethod(Invocation invocation) { print('You tried to use a non-existent member: ' + '${invocation.memberName}'); } } ``` ### 类变量和方法 #### 静态变量 静态变量只到它们被使用的时候才会初始化。 ``` class Queue { static const initialCapacity = 16; // ··· } void main() { assert(Queue.initialCapacity == 16); } ``` #### 静态方法 静态方法(类方法)不能在实例上使用,因此它们不能访问 this ``` class person { static echo(String name) { print('hello ${name}'); } } void main() { person.echo('cc'); } ``` ### call() 方法 ``` class WannabeFunction { call(String a, String b, String c) => '$a $b $c!'; } main() { var wf = new WannabeFunction(); var out = wf("Hi","there,","gang"); print('$out'); // Hi there, gang! } ``` ### 元数据 #### @deprecated 被弃用的 若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线 ``` class Television { @deprecated void activate(){ turnOn(); } } ``` #### @override重写 #### @proxy 代理 #### @required 来标记一个参数 * 告诉编译器这个参数必须要传值 * 告诉读代码的人,这个参数必须要填写 ## 泛型 ``` abstract class ObjectCache { Object getByKey(String key); void setByKey(String key, Object value); } abstract class StringCache { String getByKey(String key); void setByKey(String key, String value); } // 泛型实现 abstract class Cache<T> { T getByKey(String key); void setByKey(String key, T value); } ``` ### 限制泛型类型 ``` class Foo<T extends SomeBaseClass> { // Implementation goes here... String toString() => "Instance of 'Foo<$T>'"; } class Extender extends SomeBaseClass {...} // 可以使用 SomeBaseClass 或其任意子类作为通用参数: var someBaseClassFoo = Foo<SomeBaseClass>(); var extenderFoo = Foo<Extender>(); ``` ### mixin 混合 Dart 是不支持多继承的,但是它支持 mixin ``` class Person { say() { print('say'); } } mixin Eat { eat() { print('eat'); } } mixin Walk { walk() { print('walk'); } } mixin Code { code() { print('key'); } } class Dog with Eat, Walk{} class Man extends Person with Eat, Walk, Code{} ```