likes
comments
collection
share

Flutter学习-06-dart语法学习之继承

作者站长头像
站长
· 阅读数 9

1. dart中的继承

我们在dart中类是单继承,子类继承父类的非私有方法属性

class person{

  String? name;

  int? _height;

  bool get isHigh => (_height??=0) >180;

  void sayHello() => print('hello');

}

class student extends person{

}
void extendDemo(){
  student s = student();
  s.sayHello();
  s.name = 'jack';
  print(s.isHigh);
}

我们子类可以重写父类的方法,可以不写@override,但是一般也写方便阅读,我们也可以调用父类该方法。

class student extends person{

  int? height;
 @override
  void sayHello() {
    // TODO: implement sayHello
    super.sayHello();

    print('student say hello');
  }

  @override
  // TODO: implement isHigh
  bool get isHigh => (height??=0 )>120;

}

父类中如果有一个或多个自定义构造方法,子类必须至少实现其中的一个,不然会报错

Flutter学习-06-dart语法学习之继承 子类重写父类方法:

student.withName(String? name) : super.withName(name);
student.init() : super.init();

2. dart中的抽象类

 Dart抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。抽象类不能实例化的类 同时 抽象类通过abstract关键字类定义

abstract class addAbstractClass{

 int add(int a,int b);

}
void testDemo(){

 addAbstractClass cls =  addAbstractClass();
}

Flutter学习-06-dart语法学习之继承

2.1 抽象方法

abstract class helloFlutterAPI{

  void sayYes();//抽象方法
  void sayHello() =>print('hello flutter,today is new day');//方法

}

abstract中我们把没有方法体的方法称为抽象方法同时Dart中的抽象方法不能用abstract声明,

Flutter学习-06-dart语法学习之继承 在非抽象类中定义抽象方法会报错

abstract class addAbstractClass {
   
   void printA() => print('object');
  int add(int a,int b);

}
class addSubClass extends addAbstractClass
{
  @override
  int add(int a, int b) {
    // TODO: implement add
    return a+b -1;
  }
}

子类可以继承抽象类,抽象类的抽象方法要实现非抽象方法可以直接调用因为它已经实现了。 这其实也是多态,多态就是父类定义一个方法不去实现,让继承他的子类去实现, 每个子类有不同的表现

3.dart中的接口

我们想要实现多个抽象类方法的继承实现对应的方法怎么做呢我们可以实现implements来实现一个或者多个接口

class childClass implements helloFlutterAPI,sumAbstractClasss,addAbstractClass{
  
@override
String name;
childClass(this.name);//复写属性
 @override
  sayYes() {
    // TODO: implement sayYes
    print('yes');
  }
  @override
  void sayHello() {
    // TODO: implement sayHello

  }
  @override
  int sum(int a, int b) {
    // TODO: implement sum
    var sum =  a+b+20;
    print('sum is $sum');
    return sum;
  }

  @override
  void printA() {
    // TODO: implement printA

  }
  @override
  int add(int a, int b) {
    // TODO: implement add
    var sum =  a+b;
    print('add is $sum');
    return sum;
  }


}

我们使用implements实现多接口的实现,子类要实现父类的方法,和属性。它们的关系不是继承关系,而是父类就是定义接口,实现接口的子类要覆写接口中的所有属性和方法.

3.1 抽象类作为接口实现

abstract class redClaas {
  
  String color;
  redClaas(this.color);
  
  void changeColor(String changeColor);
  
  void printCunrrentColor();
  
}
class colorClass implements redClaas{
  
  @override 
  String color;
  colorClass(this.color);
  
  @override
  void changeColor(String changeColor) {
    // TODO: implement changeColor
    print(changeColor);
  }
  @override
  void printCunrrentColor() {
    // TODO: implement printCunrrentColor
    print(this.color);
  }
  
}

将抽象类作为接口使用(类就是接口),让子类来实现(关键字implements来实现)

4. Mixin

官方定义:

Mixin 是复用类代码的一种途径, 复用的类可以在不同层级,之间可以不存在继承关系。

简单说就是在类中混入其他的功能,实现类似多继承的功能

4.1 普通类

class a {
  String name = 'a'
  void printA()=>print('this is a class');
}

class b{
  String name = 'b'
  void printB()=>print('this is b class');
}

class c{
  String name = 'c'
  void printC()=>print('this is c class');
}

class mixClass with a,b,c{

}

实现

void main(List<String> arguments) {
  print('Hello world!');

  mixinDemo();
}
void mixinDemo(){
  mixClass class1 = mixClass();
  print(class1.name);//打印结果为c
  class1.printA();
  class1.printB();
  class1.printC();
}

在混入多个类是,类中有相同 的属性或方法,后混入的会将先混入的覆盖掉

6.2 mixin定义

我们使用mixin修饰类的时候不能初始化否则会报错

Flutter学习-06-dart语法学习之继承

mixin a {
  String name = 'a';
  void printA()=>print('this is a class');
}

 mixin b{

  String name = 'b';
  void printB()=>print('this is b class');
}

mixin c{
  String name = 'c';
  void printC()=>print('this is c class');
}

class mixClass with a,b,c{

}

6.3 混入类的继承问题

Flutter学习-06-dart语法学习之继承 混入类不能继承除了Object之外的类,我们换成Object即可

Flutter学习-06-dart语法学习之继承

6.4 混入不影响继承

class a {
  String name = 'a';
  void printA()=>print('this is a class');
}

 mixin b{

  String name = 'b';
  void printB()=>print('this is b class');
}

class c{
  String name = 'c';
  void printC()=>print('this is c class');
}


class mixClass extends a with b,c{

}
转载自:https://juejin.cn/post/7026634600499642375
评论
请登录