Dart 知识点 - 抽象类和接口
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
推荐使用线上编辑器 dartpad.cn 进行学习,测试~
抽象类
抽象类用于描述父类拥有的一种行为,但是无法给出细节实现,需要子类来实现抽象的细节。可以简单理解抽象类就是伪代码
。
抽象类一般会被定义为父类,给子类继承
抽象类的定义格式
格式如下:
```bash abstract class className { // 成员变量 [static][const][final] type name;
// 成员方法 [type] methodName(paramType: paramName ...); } ```
相关的字段说明,我们已经在之前的文章讲过。不熟悉的读者,可以进入文章 Dart 知识点 - 面向对象基础学习,这里不再赘述。
应用例子
我们定义一个抽象类 Shape
,然后定义正方形 Square
类来继承抽象类并重写抽象类的方法。如下:
```bash void main() { Square square = new Square(10, 20); var area = square.area(); print('Area is ${area}.'); // Area is 200. }
abstract class Shape { double width = 0.0;
double height = 0.0;
double area(); }
class Square extends Shape { Square(double width, double height) { this.width = width; this.height = height; }
@override double area() { return super.width * super.height; } } ```
接口
Dart
的接口没有用 interface
关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
- 如果实现的类是普通类,需要将普通类和抽象类中的方法和属性全部重写一遍。
Dart
中只允许继承一个类,但是可以实现多个接口。
我们案例走一遍,如下:
```bash void main() { Dog dog = new Dog();
dog.display(); // Animal name: Jimmy
dog.walk(); // I can walk.
}
// 抽象类 Animal abstract class Animal { String name = 'Jimmy';
void display() { print('Animal name: ${name}'); }
void eat(); }
// 抽象类作为接口 abstract class SwimAbility { bool canSwim = false; void swim(); }
// 普通类作为接口 class WalkAbility { void walk() {} }
class Dog extends Animal implements SwimAbility, WalkAbility {
bool canSwim = true; // 声明接口中的属性
// 重写吃东西的方法 @override void eat() {
}
// 重写游泳的方法 @override void swim() {
}
// 重写散步的方法 @override void walk() { print('I can walk.'); } } ```
如何区分抽象类和接口
抽象类和接口如何区分?
- 通过字面意思上区分
(非严谨,看个人写代码的习惯)
,比如:
```bash // 抽象类 abstract class Animal { }
// 抽象类作为接口 abstract class SwimAbility { }
// 普通类作为接口 class WalkAbility { } ```
- 通过子类中继承和接口的关键字来区别,比如:
bash
// extends 后面跟的是父类,implements 后面跟的是接口
class Dog extends Animal implements SwimAbility, WalkAbility {
}
往期精彩推荐
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏
- 前端开发中 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尾递归编程