Dart也是一个面向对象的语言,包含三大特性:继承、封装、多态
一、继承
- 继承使用
extends
关键字 - 子类可以访问父类中可见的 属性 和 方法 ,但是不会继承构造函数
//父类
class Parent{
String name;
String work;
//父类构造函数
Parent(this.name,this.work);
}
//子类
class Child extends Parent{
//初始化列表,先执行后面的 super方法,才会去执行Child构造函数
Child(String name, String work) : super(name, work);
}
- 子类可以复写父类中的 getter setter 方法
//父类
class Parent{
String name;
String work;
//父类构造函数
Parent(this.name,this.work);
void printInfo(){
print('name = $name , work = $work');
}
}
//子类
class Child extends Parent{
//初始化列表,先执行后面的 super方法,才会去执行Child构造函数
Child(String name, String work) : super(name, work);
//子类复写父类方法, 复写后,不再执行父类的方法
@override
void printInfo(){
print('子类 name = $name , work = $work');
}
}
抽象 abstract
- Dart 中抽象方法 不使用
abstract
关键字,没有方法体 的方法称为抽象方法
//抽象类,无法被直接实例化
abstract class Animal{
void eat();//抽象方法,没有具体实现
//抽象类中的常规方法
void printAnimalInfo(){
}
}
//子类继承抽象类,需要实现该抽象方法
class Dog extends Animal{
Dog(){
}
@override
void eat() {
// TODO: implement eat
}
}
接口(约定、规范 ) , 一个类可以实现多个接口
Dart中没有像java中的 interface
关键字来定义接口,而是普通类或者抽象类都可以作为接口被实现,同样使用 implement
关键字来实现。
- Dart中如果
implement
实现的是普通类,那么会将普通类中所有的方法属性都复写一遍。 - 推荐使用 抽象类 定义接口
注意:如果抽象类中包含共有的方法,则建议使用继承。如果抽象类仅是为了制定规范推荐使用 implement
实现。
二、多态
Dart中的多态
- 允许子类类型赋值给父类类型,例如:
Animal dog=new Dog();
- 父类定义一个方法不去实现,不同的子类去各自实现,这样同一个函数调用有不同的执行结果。
三、mixins:Dart中可以实现类似多继承的功能,使用 with
关键字实现
大家都知道,dart 跟 java一样只能单继承,但Dart中推出了一个全新的特性 mixins 但绝不是继承也不是接口。
-
作为 mixins 的类只能继承自Object 不可以有父类(不能继承其他类)。
image.png
-
作为 mixins 的类,不可以有构造函数
image.png
-
一个类可以 mixins 多个mixins 类
void main(){
//创建一个C对象,可以访问到A、B类中的方法以及属性
C c=new C();
c.printAInfo();
c.printBInfo();
c.printcInfo();
}
//mixins 类
class A{
void printAInfo(){
print('This is class A');
}
}
//mixins 类
class B{
void printBInfo(){
print('This is class B');
}
}
class C with A,B{
void printcInfo(){
print('This is class C');
}
}
- 类可以同时继承一个类,也可以 mixins 多个类;此时该类可以访问其属性和方法
//增加一个D类
class D{
String dString;
void printDInfo(){
print('This is class D');
}
}
class C extends D with A,B{
void printCInfo(){
print('This is class C');
}
}
image.png
注意:如果 mixins 类或者父类中包含同名方法,写在后面的会把前面的覆盖掉,例如
void main() {
//创建一个C对象,可以访问到A、B类中的方法以及属性
C c = new C();
c.eat();// c 调用eat方法,由于 mixins 时候,B类在后面,会把A给覆盖
}
//mixins 类
class A {
void eat() {
print('A eat !');
}
}
//mixins 类
class B {
void eat() {
print('B eat !');
}
}
//增加一个D类
class D {
String dString;
void eat() {
print('D eat !');
}
}
class C extends D with A, B {
void printCInfo() {
print('This is class C');
}
}
控制台打印:
image.png
注意:mixins 实例类型,可以通过 is
关键字,结合上面代码来判断:
网友评论