Dart 抽象类 多态 接口

68 阅读3分钟

抽象类

Dart中抽象类:Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口

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

extends抽象类 和 implements的区别:

如果要复用抽象类里面的方法,并且要用抽象方法约束自类的话我们就用extends继承抽象类 如果只是把抽象类当做标准的话我们就用implements实现抽象类

abstract class Animal {
    eat() // 抽象方法
    run() // 抽象方法
    printInfo(){
        print("我是抽象类里面的普通方法")
    }
}
class Dog extends Animal {
    @override
    eat(){
        print("小狗在吃骨头")
    }
    @override
    run(){
        print("小狗在吃跑")
    }
}

Dog d = new Dog()
d.eat()
d.run()
d.printInfo()

多态

  • 允许将子类类型的指针赋值给父类类型的指针,同一个函数调用会有不同的执行效果子类的实例赋值给父类的引用。
  • 多态就是父类定义一个方法不去实现,让继承他的子类去实现,每个子类有不同的表现
abstract class Animal {
    eat() // 抽象方法
}
class Dog extends Animal {
    @override
    eat(){
        print("小狗在吃骨头")
    }
    run(){
        print("小狗在吃跑")
    }
}

Animal d = new Dog()
d.eat()

接口

dart的接口没有interface关键字定义接口,而是普通类或抽象类都可以作为接口被实现。同样使用implements关键字进行实现。

但是dart的接口有点奇怪,如果实现的类是普通类,会将普通类和抽象中的属性的方法全部需要重写一遍

而因为抽象类可以定义抽象方法,普通类不可以,所以一般如果OC接口那样的方式,一般会使用抽象类。建议使用抽象类定义接口

abstract class DB { // 当做接口 接口:就是约定、规范
    String url // 数据库的链接地址
    add()
    save()
    delete()
}
class Mysql implements Db {
    @override url
    @override add(
        print("这是mysql的add方法")
    )
    @override save(){
        print("这是mysql的save方法")
    }
    @override delete(){
        print("这是mysql的delete方法")
    }
    Mysql(this.url)
}
class Mssql implements Db {
    @override url
    @override add(){
        print("这是Mssql的add方法")
    }
    @override save(){
        print("这是Mssql的save方法")
    }
    @override delete(){
        print("这是Mssql的deleted方法")
    }
    Mssql(this.url)
}

Mysql mysql = new Mysql("xxxx")
mysql.add()

一个类实现多个接口

abstract class A {
   printA()
}
abstract class B {
   printB()
}
class C implements A,B {
     @override printA(){print("printA")}
     @override printB(){print("printB")}
}

mixins 混入

在Dart中可以使用mixins实现类似多继承的功能

使用mixins的条件

  1. 作为mixins的类只能继承自Object,不能继承其他类
  2. 作为mixins的类不能有构造函数
  3. 一个类可以mixins多个mixins类
  4. mixins绝不是继承,也不是接口,而是一种全新的特性
class Person {
    String name;
    num age;
    Person(this.name,this.age)
    printInfo(){
        print("${this.name}---${this.age}")
    }
}
class class A {
   String info = "this is A"
   void printA(){
       print("A")
   }
}
class class B {
   printB(){
       print("B")
   }
}
class C extends Person with A,B {
    C(String name,num age):super(name,age)
}
var c = new C('zhangsan',20)
c.printInfo()
c.printA()
c.printB()
print(c.info)