当前位置 : 主页 > 编程语言 > java >

【初见Dart】第七章: Dart面向对象编程2

来源:互联网 收集:自由互联 发布时间:2022-06-30
第七章: Dart面向对象编程2 ​​1. 本章概述​​ ​​2. 继承​​ ​​2.1 举个栗子​​ ​​3. 继承中的构造方法​​ ​​3.1 构造方法执行顺序​​ ​​3.2 举个栗子​​ ​​4. 抽象类


第七章: Dart面向对象编程2

  • ​​1. 本章概述​​
  • ​​2. 继承​​
  • ​​2.1 举个栗子​​
  • ​​3. 继承中的构造方法​​
  • ​​3.1 构造方法执行顺序​​
  • ​​3.2 举个栗子​​
  • ​​4. 抽象类​​
  • ​​4.1 举个栗子​​
  • ​​5. 接口​​
  • ​​5.1 举个栗子​​
  • ​​6. Mixins​​
  • ​​6.1 举个栗子​​
  • ​​7. 操作符覆写​​
  • ​​7.1 举个栗子​​

1. 本章概述

◆ 继承,继承中的构造方法
◆ 抽象类
◆ 接口
◆ Mixins,操作符的覆写

2. 继承

◆ 使用关键字extends继承一个类
◆ 子类会继承父类可见的属性和方法,不会继承构造方法
◆ 子类能够复写父类的方法、gettter和setter
◆ 单继承,多态性

2.1 举个栗子

class Person {
int age = 10;
bool isAdult = false;

void run() {}
}

class Student extends Person {
void study() {
print("Student study. . .");
}

@override
bool get isAdult => age > 15;

@override
void run() {
print("Student run. . .");
}
}

3. 继承中的构造方法

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

3.1 构造方法执行顺序

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

3.2 举个栗子

void main() {
var student = new Student("Tom", "Male");
print(student.name);//Tom
}

class Person {
String? name;

Person(this.name);

Person.withName(this.name);
}

class Student extends Person {
int? age;
final String gender;

Student(String name, String g)
: gender = g,
super.withName(name);
}

4. 抽象类

◆ 抽象类使用abstract表示,不能直接被实例化
◆ 抽象方法不用abstract修饰,无实现
◆ 抽象类可以没有抽象方法
◆ 有抽象方法的类一定得声明为抽象类

4.1 举个栗子

void main() {
var person = new Student ();
person.run();//run. . .
}

abstract class Person {
void run();
}

class Student extends Person {
@override
void run() {
print("run. . .");
}
}

5. 接口

◆ 类和接口是统- -的,类就是接口
◆ 每个类都隐式的定义了一个包含所有实例成员的接口
◆ 如果是复用已有类的实现,使用继承(extends)
◆ 如果只是使用已有类的外在行为,使用接口(implements)

5.1 举个栗子

class Person {
String? name;

int get age => 18;

void run() {
print("Person run. . .");
}
}

class Student implements Person {
@override
String? name;

@override
int get age => 15;

@override
void run() {}
}

abstract class Person1 {
void run();
}

class Student1 implements Person1 {
@override
void run() {
print(" Student run. ..");
}
}

6. Mixins

◆ Mixins类似于多继承,是在多类继承中重用一个类代码的方式
◆ 作为Mixin的类不能有显示声明构造方法
◆ 作为Mixin的类只能继承自Object
◆ 使用关键字 with连接一个或多 个mixin

6.1 举个栗子

class A {
void a() {
print("A.a() . . .");
}
}

class B {
void b() {
print("B.b() . . .");
}
}

class C {
void c() {
print("C.c() . . .");
}
}

class D extends A with B, C {}

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

7. 操作符覆写

◆ 覆写操作符需要在类中定义

【初见Dart】第七章: Dart面向对象编程2_构造方法

◆ 如果覆写==,还需要覆写对象的hashCode getter方法

7.1 举个栗子

void main() {
var person1 = new Person(18);
var person2 = new Person(20);
print(person1 > person2);//false

person1.age;
print(person1['age']);//18
print(person1 == person2);//false
}

class Person {
int age;

Person(this.age);

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


网友评论