小菜鸡开始学习flutter之十一

46 阅读3分钟

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

今日目标

今天主要学习了解Dart中的抽象类,多态和接口这几个知识点

抽象类

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

extends抽象类和implements得区别:
1.如果要复用抽象类里面得方法,并且要用抽象方法约束子类的话,就使用extends继承抽象类
2.如果只是把抽象类当作标准的话,就用implement实现抽象类

我们来通过实际的例子来看下
假设:定义一个Animal类要求它的子类必须包含eat方法

abstract class Animal{
    eat(); // 没有实现方法体,这个eat就是一个抽象方法
}
class Dog extends Animal{}

image.png
这个时候就可以看到编辑器上有提示,我们丢失了Animal.eat这个方法的实现。

image.png 如上我们就完整的实现了这个dog子类并完善了eat这个方法,在实例中调用eat这个方法。
当然了我们在抽象类可以含有非抽象方法。比如下面这个例子所示

image.png

这里我们抽象类里实现了一个非抽象的方法run,在Dog的实例中我们可以直接去调用这个方法的。

image.png
这里尝试去实例化Animal这个类,可以看到错误提示,抽象类是不可以实例化的。

多态

其实刚我们上面的这些代码就是一个很好的多态的例子。
什么是多态呢?
1.允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果。
2.子类的实例赋值给父类调用
3.多态就是父类定义一个方法不去实现,让继承它的子类去实现,每个子类有不同的表现。

abstract class Animal{
    eat(); // 没有实现方法体,这个eat就是一个抽象方法
    run () {
      print('run run');
    }
}

class Dog extends Animal {
  @override
  eat(){
    print('dog eat');
  }
}
class Cat extends Animal {
  @override
  eat(){
    print('cat eat');
  }
}
main() {
  Dog dog = new Dog();
  dog.eat();
  dog.run();
  Cat cat = new Cat();
  cat.eat();
  cat.run();
}

image.png
通过例子可以看到,Cat和Dog分别实现了自己的eat方法。这就是多态。

image.png
如果我们实例一个Animal类型的Dog实例,可以看到提示器上并没有显示Dog上定义的run方法,这也是一种多态。

接口

和java一样,Dart也有接口的概念,但是和java还是有些区别的。

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

ending

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