小菜鸡开始学习flutter之十二

21 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

今日目标

在前面一天中我们学到了接口相关的知识,今天来学习如何在Dart中一个类实现多个接口以及Dart中的mixins还有泛型

一个类实现多个接口

abstract class A {
  printA();
}

abstract class B {
  printB();
}

class C implements A,B {
  @override
  printA(){
      pirnt('aaa');
  }
  @override
  printB(){
      print('bbb');
  }
}

image.png
像上面这样我们就在一个类C里面实现了多个接口。

Mixins

Mixins的中文意思就是混入,就是在类中混入其他功能
在Dart中可以使用mixins实现类似多继承的功能\

因为mixins使用的条件,随着Dart版本一直在变,主要了解下Dart2.x中使用mixins的条件:
1.作为mixins的类只能继承自Object,不能继承其他类
2.作为mixins的类不能有构造函数
3.一个类可以mixins多个mixins类
4.mixins绝不是继承,也不是接口,而是一种全新的特性。

class A {
  void printA (){
    print('a');
  }
}

class B {
  void printB () {
    print('b');
  }
}

class C with A,B {
  
}
main () {
  C c = new C();
  c.printA();
  c.printB();
}

image.png
如上这样就把A类和B类混入到了C类里,我们在C类的实例c中可以调用A类和B类的方法。

class Person () {
    var name;
    Person(this.name);
}

class C extends Person with A,B {}

这样我们的C类就可以继承一个有构造函数的C类同时混入A和B。

泛型

通俗理解泛型就是解决类 接口 方法的复用,以及对不特定数据类型的支持(类型校验)

T getData<T>(T value){
  return value;
}

main(){
  print(getData(21));
  
  print(getData<String>('23'));
}

如上就是泛型的使用,在第二个getData调用时指定了泛型为String,则传入的参数必须时String类型,填写其他的类型就会报错。

class Mylist<T> {
    List list = <T>[];
    void add(T value) {
        this.list.add(value);
    }
    List getList () {
        return list;
    }
}

main () {
    Mylist list = new MyList<num>();
    list.add(12);
    print(list.getList());
}

如上我们的实例list里的list就是一个num类型的List数组。

泛型接口

我们通过一个需求来理解泛型接口
实现数据缓存的功能;有文件缓存和内存缓存,按照以下接口约束实现: 1.定义一个泛型接口 约束实现它的子类必须有getBykey(key)和setByKey(key, value)
2.要求setBykey的时候的value的类型和实例化子类的时候指定的类型一致

abstract class Cache<T> {
  getByKey(String key);
  void setByKey(String key, T value);
}

class FileCache<T> implements Cache<T> {
  @override
  getByKey(String key) {
    return null;
  }
  @override
  void setByKey(String key, T value) {
    print('filecache $key----$value');
  }
}

class MemoryCache<T> implements Cache<T> {
  @override
  getByKey(String key) {
    return null;
  }
  @override
  void setByKey(String key, T value) {
    print('memorycace $key----$value');
  }
}

main () {
  MemoryCache m = new MemoryCache<String>();
  m.setByKey('key','value');
  
}

image.png 如上我们就按要求实现了接口方面的类型约定实现。这就是泛型接口的用法

ending

持续学习,加油,如有不对的地方还请指正,谢谢~~