Dart 知识点 - 面向对象基础
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情
面向对象是一种重要的编程思想。比如你需要指明 Jimmy
在说话,那么你先得从人这个类中实例化 Jimmy
出来:
```bash 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
。
面向对象基本特征
讨论面向对象,了解它们的特征,很重要。这也是面试过程中,面试官喜欢考察的一个知识点。
封装
封装就是把内部的实现隐藏起来,然后只是暴露必要的方法让外部调用。暴露的方法我们称之为接口
。
还是拿刚才的示例来说明:
bash
class Person {
sayHi(String name) {
print(name + ' is speaking...'); // Jimmy is speaking...
}
}
这里我知识暴露出了一个 sayHi
的方法,你不需要管里面是怎么实现的,实现有多简单或者多复杂,你只要按照要求调用这个接口就行了,比如:
/*
* 调用 sayHi 接口
* @Function sayHi
* @param <String> name
* @return void
*/
继承
所谓的继承,就是使得子类具有父类等的各种公开的方法和属性。比如:
```bash // 父类继承 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
在水里,如下:
```bash 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.'); } } ```
抽象
我们一般说面向对象的三个特征:封装,继承和多态。抽象也是面向对象的一个本质特征。比如我们上面举的多态的例子中,我们可以找到 Dog
和 Fish
的共性,并将他们抽象出来表示。
bash
// 定义一个抽象类
abstract class Animal {
late String name; // 名字
live(); // 生存(抽象方法)
eat() { // 非抽象方法
print('Can eat.');
}
}
类声明
Dart
中,一个类的实现包括类声明和类体。类声明的语法格式:
bash
[ abstract ] class className [extends superClassName] [implements interfaceName] [with className1, className2, ...] {
// 类体
}
abstract
表示该类是抽象类,此关键字可省略,推荐加上extends
是继承类的关键字,superClassName
是父类类名implements
是实现某个接口的关键字,interfaceName
是接口名称with
是混入多个类的关键字,多个类用,
分隔开
类构成
Dart
中类的构成,包含:
- 类名
- 成员变量
- 成员方法
- 构造方法
类名
声明一个类的时候,关键字 class
后面的 className
名称就是类名...
成员变量
声明类中成员变量的格式,如下:
bash
class className {
// 成员变量
[static][const][final] type name;
}
type
是成员变量的数据类型name
是成员变量名[static][const][final]
是成员变量的修饰符static
表示成员变量在类本身可以使用,在类的实例上不可用const
用来定义常量,值不可改变final
表示单一赋值,赋值后不能更改final
变量的值
⚠️ const 和 final 的区别在于:
const
比final
更加严格。final
只是要求变量在初始化后值不变,但是通过final
无法在编译时(运行之前)知道这个变量的值,而const
是修饰编译时的常量,从一开始就知道它的值。
成员方法
声明类中成员方法的格式,如下:
bash
class className {
// 成员方法
[static][type] methodName(paramType: paramName, ...) [async] {
// 方法体
}
}
type
表示函数方法返回值的数据类型methodName
表示方法名static
是方法修饰符,表示该方法只能是类本身调用,不能在实例上可用paramType
表示方法参数类型,paramName
表示方法参数名称;可以有多个参数,用,
来分隔开async
表示方法是异步的
构造方法
构造方法是类中的特殊的方法。在类进行初始化的时候执行,比如:
```bash 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 + '.'); } } ```
关于构造函数,后面会有文章详细介绍...
往期精彩推荐
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏
- 前端开发中 5 个很赞的资源
- 懂点心理学 - 马太效应
- Flutter 构建一个 todo list 应用
- Dart 知识点 - 数据类型
- Dart 知识点 - 混入 Mixin
- Dart 知识点 - 集合 List, Set, Map
- Flutter - 使用 push(), pop() 和路由进行导航
- Dart 知识点 - 面向对象基础
- Flutter: Stateful 挂件 vs Stateless 挂件
- Flutter 实现登录 UI
- Dart 知识点 - 抽象类和接口
- 自 2020 年以来全球的开源商业化软件融资情况
- IstioCon 2022 回顾及录像、PPT 分享
- 网页实现 1CM 物理长度
- Flutter 开发出现的那些 Bugs 和解决方案「持续更新... 」
- 仿写新闻客户端
- Beyond Istio OSS —— Istio 服务网格的现状及未来
- 在外企的工作生活「年中总结」
- 如何在 Istio 中集成 SPRIRE?
- Javascript尾递归编程