持续创作,加速成长!这是我参与「掘金日新计划 · 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');
}
}
像上面这样我们就在一个类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();
}
如上这样就把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');
}
如上我们就按要求实现了接口方面的类型约定实现。这就是泛型接口的用法
ending
持续学习,加油,如有不对的地方还请指正,谢谢~~