抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
抽象类通常应用于定义接口。
抽象类特点:
这个例子可以验证一下知识点和思想:
abstract class Person {
bool canSpeak = true;
eat() {}
}
abstract class Musical extends Person {
bool? canSing;
sing() {}
}
abstract class Studnet extends Person {
String? className;
goToSchool() {
}
}
class MusicMan implements Musical, Studnet {
@override
bool? canSing;
@override
bool canSpeak = true;
@override
String? className;
@override
eat() {
// TODO: implement eat
throw UnimplementedError();
}
@override
goToSchool() {
// TODO: implement goToSchool
throw UnimplementedError();
}
@override
sing() {
// TODO: implement sing
throw UnimplementedError();
}
}那么问题来了,抽象类可以默认实现方法和属性,我想进行代码复用,不需要实现怎么办呢?
看下面的例子。
我们知道,我们可以通过类的 extends 的继承,来实现复用父类的代码。
abstract class 和 class 类似都可以使用 extends 复用继承。
abstract class Person {
bool canSpeak = true;
eat() {
print('吃饭');
}
}
abstract class Musical extends Person {
bool? canSing;
sing() {}
}
class MusicMan extends Musical {}
void main(List<String> args) {
var liyundi = new MusicMan();
liyundi.eat();
}我们需要一个函数,参数是一个Person,Musical 和 Student都属于人,所以都应该可以传入。
这时候可以利用这种进行约束,接口设计。都继承于Person抽象类。
abstract class Person {
bool canSpeak = true;
eat() {}
}
abstract class Musical extends Person {
bool? canSing;
sing() {}
}
abstract class Studnet extends Person {
String? className;
goToSchool() {}
}
class MusicMan extends Musical {}
class Children extends Studnet {}
class Dog {}
void main(List<String> args) {
void testAbs(Person args) {
print(args);
}
var liyundi = new MusicMan();
var kid = new Children();
var dog = new Dog();
testAbs(liyundi);
testAbs(kid);
testAbs(dog);
}Dog 类没有继承于Person 所以不可以赋值,报错。

2、3作用,类其实也是可以的,我的理解dart 的类是包含abstract 的。可以作为接口,也可以实现,接口作为子集,可以作为接口和实现部分。