Dart 知识点 - 面向对象基础

面向对象是一种重要的编程思想。比如你需要指明 Jimmy 在说话,那么你先得从人这个类中实例化 Jimmy 出来:

void main() {
  var person = new Person();
  person.sayHi('Jimmy');
}

class Person {
  sayHi(String name) {
    print(name + ' is speaking...'); // Jimmy is speaking...
  }
}

推荐使用线上编辑器 dartpad.cn 进行学习,测试~

Dart 是一门面向对象的编程语言,具备类和基于混入的继承。所有的类都派生自 Object

面向对象基本特征

讨论面向对象,了解它们的特征,很重要。这也是面试过程中,面试官喜欢考察的一个知识点。

封装

封装就是把内部的实现隐藏起来,然后只是暴露必要的方法让外部调用。暴露的方法我们称之为接口

还是拿刚才的示例来说明:

class Person {
  sayHi(String name) {
    print(name + ' is speaking...'); // Jimmy is speaking...
  }
}

这里我知识暴露出了一个 sayHi 的方法,你不需要管里面是怎么实现的,实现有多简单或者多复杂,你只要按照要求调用这个接口就行了,比如:

/*
* 调用 sayHi 接口
* @Function sayHi
* @param <String> name
* @return void
*/

继承

所谓的继承,就是使得子类具有父类等的各种公开的方法和属性。比如:

// 父类继承
void main() {
  var dog = new Dog('Tom');
  dog.sleep(); // Tom must go to sleep.
}

class Animal {
  String name;
  Animal(this.name);
  sleep() {
    print(this.name + ' must go to sleep.');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  barking() {
    print('Dog is barking.');
  }
}

多态

多态可以理解为相同的行为,不同的实现方式。比如:狗生活 live 在陆地上,鱼儿生活 live 在水里,如下:

void main() {
  var dog = new Dog();
  var fish = new Fish();
  
  dog.live(); // Jimmy living on land.
  
  fish.live(); // Tom living in water.
}

// 定义一个抽象类
abstract class Animal {
  late String name;
  live(); // 生存
}

class Dog extends Animal {
  @override
  String name = 'Jimmy';
  
  @override
  live() {
    print(this.name + ' living on land.');
  }
}

class Fish extends Animal {
  @override
  String name = 'Tom';
    
  @override
  live() {
    print(this.name + ' living in water.');
  }
}

抽象

我们一般说面向对象的三个特征:封装,继承和多态抽象也是面向对象的一个本质特征。比如我们上面举的多态的例子中,我们可以找到 DogFish 的共性,并将他们抽象出来表示。

// 定义一个抽象类
abstract class Animal {
  late String name; // 名字
  live(); // 生存(抽象方法)
  eat() { // 非抽象方法
    print('Can eat.');
  }
}

类声明

Dart 中,一个类的实现包括类声明和类体。类声明的语法格式:

[ abstract ] class className [extends superClassName] [implements interfaceName] [with className1, className2, ...] {
  // 类体
}
  • abstract 表示该类是抽象类,此关键字可省略,推荐加上
  • extends 是继承类的关键字,superClassName 是父类类名
  • implements 是实现某个接口的关键字,interfaceName 是接口名称
  • with 是混入多个类的关键字,多个类用 , 分隔开

类构成

Dart 中类的构成,包含:

  • 类名
  • 成员变量
  • 成员方法
  • 构造方法

类名

声明一个类的时候,关键字 class 后面的 className 名称就是类名...

成员变量

声明类中成员变量的格式,如下:

class className {
  // 成员变量
  [static][const][final] type name;
}
  • type 是成员变量的数据类型
  • name 是成员变量名
  • [static][const][final] 是成员变量的修饰符
    • static 表示成员变量在类本身可以使用,在类的实例上不可用
    • const 用来定义常量,值不可改变
    • final 表示单一赋值,赋值后不能更改 final 变量的值

⚠️ constfinal 的区别在于:constfinal 更加严格。final 只是要求变量在初始化后值不变,但是通过 final 无法在编译时(运行之前)知道这个变量的值,而 const 是修饰编译时的常量,从一开始就知道它的值。

成员方法

声明类中成员方法的格式,如下:

class className {
  // 成员方法
  [static][type] methodName(paramType: paramName, ...) [async] {
    // 方法体
  }
}
  • type 表示函数方法返回值的数据类型
  • methodName 表示方法名
  • static 是方法修饰符,表示该方法只能是类本身调用,不能在实例上可用
  • paramType 表示方法参数类型,paramName 表示方法参数名称;可以有多个参数,用 , 来分隔开
  • async 表示方法是异步的

构造方法

构造方法是类中的特殊的方法。在类进行初始化的时候执行,比如:

void main() {
  var person = new Person('Jimmy', 100);
  person.sayHi(); // Hello Jimmy.
}

class Person {
  String name = '';
  double height = 0.0;
  // 构造函数
  Person(this.name, this.height);
  
  sayHi() {
    print('Hello ' + this.name + '.');
  }
}

关于构造函数,后面会有文章详细介绍...

往期精彩推荐

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏