美文网首页
Dart基础(五)面向对象

Dart基础(五)面向对象

作者: 徘徊0_ | 来源:发表于2020-03-24 16:16 被阅读0次

    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基础(五)面向对象

          本文链接:https://www.haomeiwen.com/subject/mvnwyhtx.html