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

複製代碼
相關文章
相關標籤/搜索