Dart 语法基础(二) 类与函数

220 阅读2分钟

函数

main(List<String> args) {
  sayHello("name");

  sayHello2("name", 18, 1.88);
  sayHello2("name", 18);

  sayHello3("name", age: 20, height: 1.88);
  sayHello3("name", age: 20);//参数可省略
}

必选参数

void sayHello(String name) {
  print(name);
}

可选参数

只有可选参数可以给默认值

位置可选参数

[] 里面可省略

void sayHello2(String name, [int age = 10, double height = 1.0]) {
    
}

命名可选参数

{} 里可省略,但调用必须是标签参数调用

void sayHello3(String name, {int age = 20, double height = 2.0}) {
    
}

类的构造方法

main(List<String> args) {
  var p = Person("Joho", 30);

  var p2 = Person("Joho", 30);

  var p3 = Person.withNameAndAge("Joho", 18);

  var map = {'name': 'kobe', 'age': 30};
  var p4 = Person.fromMap(map);
}

class Person {
  String name;
  int age;
  double height;
}

普通构造方法

Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

语法糖

  Person(this.name, this.age);

命名构造方法

Person.withNameAndAge(String name, int age) {
    this.name = name;
    this.age = age;
  }

map 构造

Person.fromMap(Map<String, Object> map) {
    this.name = map["name"];
    this.age = map["age"];
  }

初始化列表

class Person {
  final String name;
  final int age;
  
  //类的初始化列表
  
  Person(this.name) : age = 10;
  //或
  Person(this.name, {this.age = 10});
}

类的继承

关键字: extends

class Person {
  String name;
  int age;
  Person(this.name, this.age);
}

class Student extends Person {
  String id;
  // 继承父类 name、age 属性,调用 super 构造方法
  Student(this.id, String name, int age) : super(name, age);
}

抽象类的使用

关键字: abstract

abstract class Shape {
  double area();
  String getInfo() {
    return "shape";
  }
}

class Square extends Shape {
  @override
  double area() {
    return 100.0;
  }

  @override
  String getInfo() {
    return "square";
  }
}

总结

  • 继承自抽象类后,必须实现抽象类的所有抽象方法
  • 抽象类不能实例化

为什么 Map 可以实例化

var map = Map();
map["name"] = "Joho";
print(map);

截屏2021-08-02 下午11.19.41.png

Map 是抽象类,但却可以实例化,原因在于 external factory Map();

external 关键字 可以把 声明和 实现分离,需配合注解 @patch 实现

@patch 可以针对不同平台进行实现

见: map_patch.dart

隐式接口

dart 没有 interface、protocol 这样的关键字表示接口,但是默认的所有类都相当于接口,dart 不支持多继承
在开发中,通常使用 abstract 用于给别人实现的类声明为抽象类
main(List<String> args) {
  final sm = SuperMan();
  sm.run();
  sm.fly();
}

abstract class Runner {
  run();
}

abstract class Flyer {
  fly();
}

class SuperMan implements Runner, Flyer {
  @override
  run() {
    print("SuperMan is running");
  }

  @override
  fly() {
    print("SuperMan is flying");
  }
}

mixin 混入

在通过 implements 实现某个类时,类中所有的方法都必须被重新实现,但是某些时候,一个类可能希望直接复用之前类的实现方案,这就需要借助于 mixin 关键字,

借助于 mixin 关键字定义一个类,借助于 with 关键字来进行混入。

main(List<String> args) {
  final sw = SuperWoman();
  sw.run();
  sw.fly();
}

mixin Runner {
  run();
}

mixin Flyer {
  fly();
}

// implements 的方式必须要对其中的方法进行 onverride
class SuperMan implements Runner, Flyer {
  @override
  run() {}

  @override
  fly() {}
}

// with 关键字 则不需要 override 
class SuperWoman with Runner, Flyer {
  run() {
    print("Superwoman is running");
  }

  fly() {
    print("Superwoman is flying");
  }
}