美文网首页
Dart 抽象类 多态 接口

Dart 抽象类 多态 接口

作者: XieHenry | 来源:发表于2020-08-13 09:52 被阅读0次

    1.抽象类

    Dart中抽象类: Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。
    1、抽象类通过abstract 关键字来定义
    2、Dart中的抽象方法不能用abstract声明,Dart中没有方法体的方法我们称为抽象方法。
    3、如果子类继承抽象类必须得实现里面的抽象方法
    4、如果把抽象类当做接口实现的话必须得实现抽象类里面定义的所有属性和方法。
    5、抽象类不能被实例化,只有继承它的子类可以

    //案例:定义一个Animal 类要求它的子类必须包含eat方法
    abstract class Animal {
      eat(); //抽象方法
      run(); //抽象方法
      printInfo() {
        print('我是一个抽象类里面的普通方法');
      }
    }
    
    
    class Dog extends Animal {
      @override
      eat() {
         print('小狗在吃骨头');
      }
      @override
      run() {
        // TODO: implement run
        print('小狗在跑');
      }
    }
    
    //main函数中调用
    Dog d = new Dog();  
    d.eat();      //小狗在吃骨头
    d.printInfo();//我是一个抽象类里面的普通方法
    

    2.多态

    Datr中的多态:(1是官方解释。2 3为通俗理解)
    1.允许将子类类型的指针赋值给父类类型的指针, 同一个函数调用会有不同的执行效果 。
    2.子类的实例赋值给父类的引用。
    3.多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现。

    //简单例子
    abstract class Animal {
      eat(); //抽象方法
    }
    
    class Dog extends Animal {
      @override
      eat() {
        print('小狗在吃骨头');
      }
      run() {
        print('run');
      }
    }
    
    class Cat extends Animal {
      @override
      eat() {
        print('小猫在吃老鼠');
      }
      run() {
        print('run');
      }
    }
    
    //main中函数调用
    Animal d = new Dog();
    d.eat();
    
    Animal c = new Cat();
    c.eat();
    

    3.接口

    和Java一样,dart也有接口,但是和Java还是有区别的。
    首先,dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。
    同样使用implements关键字进行实现。
    但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要覆写一遍。
    而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现像Java接口那样的方式,一般会使用抽象类。
    建议使用抽象类定义接口。

    abstract class Db{   //当做接口   接口:就是约定 、规范
        String uri;      //数据库的链接地址
        add(String data);
        save();
        delete();
    }
    
    
    class Mysql implements Db{
      @override
      String uri;
    
      Mysql(this.uri);
    
      @override
      add(data) {
        // TODO: implement add
        print('这是mysql的add方法'+data);
      }
    
      @override
      delete() {
        // TODO: implement delete
        return null;
      }
      @override
      save() {
        // TODO: implement save
        return null;
      }
      remove(){
      }
    }
    
    class MsSql implements Db{
      @override
      String uri;
      @override
      add(String data) {
        print('这是mssql的add方法'+data);
      }
    
      @override
      delete() {
        // TODO: implement delete
        return null;
      }
    
      @override
      save() {
        // TODO: implement save
        return null;
      }
    }
    
    //main函数中调用
    Mysql mysql=new Mysql('xxxxxx');
    mysql.add('1243214');
    

    4.一个类实现多个接口

    //Dart中一个类实现多个接口:
    abstract class A{
      String name;
      printA();
    }
    
    abstract class B{
      printB();
    }
    
    class C implements A,B{  
      @override
      String name;  
      @override
      printA() {
        print('printA');
      }
      @override
      printB() {
        // TODO: implement printB
        return null;
      }
    }
    
    //main函数中实现
    C c = new C();
    c.printA();
    

    5.Dart中的mixins

    mixins的中文意思是混入,就是在类中混入其他功能。
    在Dart中可以使用mixins实现类似多继承的功能
    因为mixins使用的条件,随着Dart版本一直在变,这里讲的是Dart2.x中使用mixins的条件:
    1、作为mixins的类只能继承自Object,不能继承其他类
    2、作为mixins的类不能有构造函数
    3、一个类可以mixins多个mixins类
    4、mixins绝不是继承,也不是接口,而是一种全新的特性

    class A {
      String info="this is A";
      void printA(){
        print("A");
      }
    }
    
    class B {
      void printB(){
        print("B");
      }
    }
    
    class C with A,B{
      
    }
    
    //main函数中调用
    var c=new C();  
    c.printA();
    c.printB();
    print(c.info);
    

    相关文章

      网友评论

          本文标题:Dart 抽象类 多态 接口

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