面向对象编程:抽象类与接口
抽象类
抽象类不能被实例化,可以包含抽象方法。
dart
abstract class Shape {
// 抽象方法(无实现)
double area();
double perimeter();
// 具体方法
void display() {
print('面积:${area()},周长:${perimeter()}');
}
}
class Circle extends Shape {
double radius;
Circle(this.radius);
@override
double area() => 3.14159 * radius * radius;
@override
double perimeter() => 2 * 3.14159 * radius;
}
class Rectangle extends Shape {
double width, height;
Rectangle(this.width, this.height);
@override
double area() => width * height;
@override
double perimeter() => 2 * (width + height);
}
void main() {
Shape circle = Circle(5);
Shape rectangle = Rectangle(4, 6);
circle.display(); // 面积:78.53975,周长:31.4159
rectangle.display(); // 面积:24.0,周长:20.0
}接口
在 Dart 中,每个类都隐式定义一个接口。使用 implements 实现接口。
dart
class Flyable {
void fly() {
print('飞行');
}
}
class Swimmable {
void swim() {
print('游泳');
}
}
class Duck implements Flyable, Swimmable {
@override
void fly() {
print('鸭子在飞');
}
@override
void swim() {
print('鸭子在游泳');
}
}
void main() {
var duck = Duck();
duck.fly(); // 鸭子在飞
duck.swim(); // 鸭子在游泳
}抽象类 vs 接口
dart
// 抽象类 - 可以有实现
abstract class Animal {
void eat() {
print('吃东西...');
}
void makeSound(); // 抽象方法
}
// 接口 - 必须实现所有方法
class Walkable {
void walk() {
print('行走');
}
}
class Dog extends Animal implements Walkable {
@override
void makeSound() {
print('汪!');
}
@override
void walk() {
print('狗在行走');
}
}