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

函数

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);
}
复制代码

可选参数

只有可选参数能够给默认值markdown

位置可选参数

[] 里面可省略ide

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});
}
复制代码

类的继承

关键字: extendsui

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);
}
复制代码

抽象类的使用

关键字: abstractthis

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

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

  @override
  String getInfo() {
    return "square";
  }
}
复制代码

总结spa

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

为何 Map 能够实例化

var map = Map();
map["name"] = "Joho";
print(map);
复制代码

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

Map 是抽象类,但却能够实例化,缘由在于 external factory Map(); code

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

@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");
  }
}

复制代码