搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 考拉的日常 > Dart语言(六):类

Dart语言(六):类

考拉的日常 2019-11-08

多态

类型为Person 所以只能访问Person类的方法属性
子类的实例赋值给父类的引用
如果一个父类有多个子类实现的话,可以实现这种方式
所有的类都有一个默认父类Object
void main(){ var jack = new Student(); jack.study(); jack.run(); print(jack.name);  print(jack.isAdult);    Person lucy = new Student(); if(lucy is Student){ // 可以使用对象操作符 is 来访问子类的属性 lucy.study(); } print('------------------'); print(lucy); //Instance of 'Student' Student的一个实例}
class Person{ String name; int age = 20; String brithday; bool get isAdult => age > 18; void run(){ print('person run...'); }}


extends继承

使用extends关键字 继承一个类
子类会继承父类可见的属性和方法,不能继承构造方法
子类能够复写父类的方法,getter和setter
单继承,多态性
继承,多台,封装 三大特性
class Person{ String name; int age = 20; String brithday; bool get isAdult => age > 18; void run(){ print('person run...'); }}class Student extends Person{ void study(){ print('Student run...'); } @override //@override注解:表示重写父类属性 ,可写可不写 bool get isAdult => age >15;}


继承中的构造方法

子类的构造方法默认会调用父类的无名无参构造方法
如果父类没有无名无参构造方法,则需要显示调用父类构造方法
在构造方法参后使用 :显示调用父类构造方法

构造方法执行顺序

父类的构造方法在子类构造方法体开始执行的位置调用
如果有初始化列表,初始化列表会在父类构造方法之前执行


void main(){ var jack = new Student('jack','哈哈'); jack.say(); // My name is jack}class Person{ String name; Person(this.name); //无名称构造方法 Person.withName(this.name); //有名称构造方法}
class Student extends Person{ int age; final String gender; // Student(String name, String gender): gender = gender, super(name);//调用父类无名 构造方法, 也可调用父类有名 构造方法 void say(){ print('My name is $name'); }}


抽象类

抽象类使用abstract表示,不能直接被实例化
抽象方法不用abstract修饰,无实现
抽象类可以没有抽象方法
abstract class Person{ void run(){} // 抽象方法 空实现//void run(); // 抽象方法 无实现}class Student extends Person{ @override void run(){ print('111'); // 如果父类抽象方法是空实现 则可以重写抽象方法 // 如果父类抽象方法是无实现 则必须实现抽象方法 }}


接口

类和接口是统一的,类就是接口
每个类都隐式的定义了一个包含所有实例成员的接口
如果是复用已有类的实现,使用继承(extends)
如果只是使用已有类的外在行为,使用接口(implements)
class Person{ String name; int get age => 16; // 计算属性 void run(){ print('Person run ...');  }}
class Student implements Person{ // dart直接使用类名作为接口的使用 重写Person接口所有属性方法 @override String name; int get age => null; void run(){ print('run...'); }}
void main(){ var jack = new Student(); jack.run();}
// 如果使用接口 尽量使用抽象类的形式来作为接口abstract class Person{ void run();}
// dart直接使用类名作为接口的使用 重写Person接口所有属性方法class Student implements Person{ void run(){ print('student run...'); }}


Mixins 

Mixins类似于多继承,是在多类继承中重用一个类代码的方式
作为Mixin的类不能有显示声明构造方法
作为Minxin的类智能继承自Object
使用关键字with连接一个或多个mixin
void main(){ var d = new D(); d.a(); d.b(); d.c();}
class A{ void a(){ print('A.a()...'); }}class B{ void b(){ print('B.b()...'); }}class C{ void c(){ print('C.c()...'); }}//先有extends继承 才能使用 Mixinsclass D extends A with B,C{
}
void main() { var d = new D(); d.a(); d.b(); d.c(); // 出现这个结果跟Mixins的顺序有关系 // C.a()... // C.b()... // C.c()...}
class A { void a() { print('A.a()...'); }}
class B { //B(){}; //ERROR Mixins的类不能有显式构造方法 void a() { print('B.a()...');  } void b() { print('B.b()...'); }}class Test{}class C extends Test { //error void a() { print('C.a()...');  } void b() { print('C.b()...');  } void c() { print('C.c()...'); }}class D extends A with B, C {  //先有extends继承 才能使用 Mixins}
void main() {var a = new Car();a.run(); // 轮胎...a.work(); // Work with Electric...}
abstract class Engine{  void work(){}}
class OilEngine implements Engine{ //烧油的 @override void work(){ print('Work with oil...'); }}
class ElectricEngine implements Engine{ //电动车 @override void work(){ print('Work with Electric...'); }}
class Tyre{ // 轮胎 String name; void run(){ print('轮胎...'); }}
class Car = Tyre with ElectricEngine; // 简写class Car2 extends Tyre with ElectricEngine// 完整写法}class Bus = Tyre with OilEngine;


操作符覆写

覆写操作符需要在类中定义
 如果覆写 == ,还需要复写对象的hashCode getter方法
void main() { var jack = new Person(20); var tom = new Person(23); print(jack > tom); // false  print(jack['age']); // 20  print(jack == tom); // false}
class Person { int age; Person(this.age);  /** * 返回类型 operator 操作符 (参数1,参数2,...){ * 实现体 * return 返回值 * } * 如果覆写 == ,还需要复写对象的hashCode getter方法 */ bool operator >(Person person) { // 覆写 > return this.age > person.age; }
int operator [](String str) { // 覆写 [] if ('age' == str) { return age; } return 0; }
@override bool operator ==(Object other) => // 覆写== identical(this, other) || other is Person && runtimeType == other.runtimeType && age == other.age; @override int get hashCode => age.hashCode;}



版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Dart语言(六):类》的版权归原作者「考拉的日常」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注考拉的日常微信公众号

考拉的日常微信公众号:web_cbs8710064

考拉的日常

手机扫描上方二维码即可关注考拉的日常微信公众号

考拉的日常最新文章

精品公众号随机推荐