Dart基础(五)面向对象

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 关键字,结合上面代码来判断:

image.png

你可能感兴趣的:(Dart基础(五)面向对象)