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

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. 操作符覆写

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

在这里插入图片描述

◆ 如果覆写==,还需要覆写对象的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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42473228/article/details/123892967