深入理解Dart:抽象类与接口的探索
发表时间: 2022-11-30 12:47
#头条创作挑战赛#
本文同步本人掘金平台的文章:
https://juejin.cn/post/7128406077502128142
推荐使用线上编辑器 dartpad.cn 进行学习,测试~
抽象类用于描述父类拥有的一种行为,但是无法给出细节实现,需要子类来实现抽象的细节。可以简单理解抽象类就是伪代码。
抽象类一般会被定义为父类,给子类继承
抽象类的定义格式
格式如下:
abstract class className { // 成员变量 [static][const][final] type name; // 成员方法 [type] methodName(paramType: paramName ...);}复制代码
相关的字段说明,我们已经在之前的文章讲过。不熟悉的读者,可以进入文章 Dart 知识点 - 面向对象基础学习,这里不再赘述。
应用例子
我们定义一个抽象类 Shape,然后定义正方形 Square 类来继承抽象类并重写抽象类的方法。如下:
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 中只允许继承一个类,但是可以实现多个接口。
我们案例走一遍,如下:
void main() { Dog dog = new Dog(); dog.display(); // Animal name: Jimmy dog.walk(); // I can walk.}// 抽象类 Animalabstract 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.'); }}复制代码
抽象类和接口如何区分?
// 抽象类abstract class Animal {}// 抽象类作为接口abstract class SwimAbility {}// 普通类作为接口class WalkAbility {}复制代码
// extends 后面跟的是父类,implements 后面跟的是接口class Dog extends Animal implements SwimAbility, WalkAbility {}复制代码
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏