• Dart语言学习笔记(4)


    使用类成员

    var p = Point(2, 2);
    // Set the value of the instance variable y.
    p.y = 3;
    // Get the value of y.
    assert(p.y == 3);
    // Invoke distanceTo() on p.
    double distance = p.distanceTo(Point(4, 4));
    // If p is non-null, set its y value to 4.
    p?.y = 4;
    

    使用构造器

    var p1 = Point(2, 2);
    var p2 = Point.fromJson({'x': 1, 'y': 2});
    // new 可以省略
    var p1 = new Point(2, 2);
    var p2 = new Point.fromJson({'x': 1, 'y': 2});
    // 常量对象
    var p = const ImmutablePoint(2, 2);
    // 使用相同参数构造的常量对象具有唯一性
    var a = const ImmutablePoint(1, 1);
    var b = const ImmutablePoint(1, 1);
    assert(identical(a, b)); // They are the same instance!
    // const 可省略
    // Lots of const keywords here.
    const pointAndLine = const {
      'point': const [const ImmutablePoint(0, 0)],
      'line': const [const ImmutablePoint(1, 10), const ImmutablePoint(-2, 11)],
    };
    // 相当于
    // Only one const, which establishes the constant context.
    const pointAndLine = {
      'point': [ImmutablePoint(0, 0)],
      'line': [ImmutablePoint(1, 10), ImmutablePoint(-2, 11)],
    };
    // 常量对象和非常量对象不等价
    var a = const ImmutablePoint(1, 1); // Creates a constant
    var b = ImmutablePoint(1, 1); // Does NOT create a constant
    assert(!identical(a, b)); // NOT the same instance!
    

    运行期类型

    print('The type of a is ${a.runtimeType}');
    

    实例变量

    // 未初始化的实例变量初值为 null
    class Point {
      double x; // Declare instance variable x, initially null.
      double y; // Declare y, initially null.
      double z = 0; // Declare z, initially 0.
    }
    // 实例变量自动生成 getter
    // 非 final 实例变量自动生成 setter
    class Point {
      double x;
      double y;
    }
    void main() {
      var point = Point();
      point.x = 4; // Use the setter method for x.
      assert(point.x == 4); // Use the getter method for x.
      assert(point.y == null); // Values default to null.
    }
    

    构造器

    class Point {
      double x, y;
      Point(double x, double y) {
        // There's a better way to do this, stay tuned.
        this.x = x;
        this.y = y;
      }
    }
    // 相当于
    class Point {
      double x, y;
      // Syntactic sugar for setting x and y
      // before the constructor body runs.
      Point(this.x, this.y);
    }
    // 具名构造器
    class Point {
      double x, y;
      Point(this.x, this.y);
      // Named constructor
      Point.origin() {
        x = 0;
        y = 0;
      }
    }
    // 调用基类的具名构造器
    class Employee extends Person {
      Employee() : super.fromJson(defaultData);
      // ···
    }
    // 初始化列表
    // Initializer list sets instance variables before
    // the constructor body runs.
    Point.fromJson(Map<String, double> json)
        : x = json['x'],
          y = json['y'] {
      print('In Point.fromJson(): ($x, $y)');
    }
    // 初始化时可以使用断言
    Point.withAssert(this.x, this.y) : assert(x >= 0) {
      print('In Point.withAssert(): ($x, $y)');
    }
    // 转发给别的构造器
    class Point {
      double x, y;
      // The main constructor for this class.
      Point(this.x, this.y);
      // Delegates to the main constructor.
      Point.alongXAxis(double x) : this(x, 0);
    }
    // 常量构造器
    class ImmutablePoint {
      static final ImmutablePoint origin =
          const ImmutablePoint(0, 0);
      final double x, y;
      const ImmutablePoint(this.x, this.y);
    }
    // 工厂构造器
    class Logger {
      final String name;
      bool mute = false;
      // _cache is library-private, thanks to
      // the _ in front of its name.
      static final Map<String, Logger> _cache =
          <String, Logger>{};
      factory Logger(String name) {
        return _cache.putIfAbsent(
            name, () => Logger._internal(name));
      }
      factory Logger.fromJson(Map<String, Object> json) {
        return Logger(json['name'].toString());
      }
      Logger._internal(this.name);
      void log(String msg) {
        if (!mute) print(msg);
      }
    }
    // 调用工厂构造器
    var logger = Logger('UI');
    logger.log('Button clicked');
    var logMap = {'name': 'UI'};
    var loggerJson = Logger.fromJson(logMap);
    

    方法

    // 实例方法
    import 'dart:math';
    class Point {
      double x, y;
      Point(this.x, this.y);
      double distanceTo(Point other) {
        var dx = x - other.x;
        var dy = y - other.y;
        return sqrt(dx * dx + dy * dy);
      }
    }
    // getter setter
    class Rectangle {
      double left, top, width, height;
      Rectangle(this.left, this.top, this.width, this.height);
      // Define two calculated properties: right and bottom.
      double get right => left + width;
      set right(double value) => left = value - width;
      double get bottom => top + height;
      set bottom(double value) => top = value - height;
    }
    void main() {
      var rect = Rectangle(3, 4, 20, 15);
      assert(rect.left == 3);
      rect.right = 12;
      assert(rect.left == -8);
    }
    

    抽象方法和抽象类

    abstract class Doer {
      // Define instance variables and methods...
      void doSomething(); // Define an abstract method.
    }
    class EffectiveDoer extends Doer {
      void doSomething() {
        // Provide an implementation, so the method is not abstract here...
      }
    }
    // This class is declared abstract and thus
    // can't be instantiated.
    abstract class AbstractContainer {
      // Define constructors, fields, methods...
      void updateChildren(); // Abstract method.
    }
    

    隐式接口

    // A person. The implicit interface contains greet().
    class Person {
      // In the interface, but visible only in this library.
      final _name;
      // Not in the interface, since this is a constructor.
      Person(this._name);
      // In the interface.
      String greet(String who) => 'Hello, $who. I am $_name.';
    }
    // An implementation of the Person interface.
    class Impostor implements Person {
      get _name => '';
      String greet(String who) => 'Hi $who. Do you know who I am?';
    }
    String greetBob(Person person) => person.greet('Bob');
    void main() {
      print(greetBob(Person('Kathy')));
      print(greetBob(Impostor()));
    }
    // 实现多个接口
    class Point implements Comparable, Location {...}
    

    类的扩展(继承)

    class Television {
      void turnOn() {
        _illuminateDisplay();
        _activateIrSensor();
      }
      // ···
    }
    class SmartTelevision extends Television {
      void turnOn() {
        super.turnOn();
        _bootNetworkInterface();
        _initializeMemory();
        _upgradeApps();
      }
      // ···
    }
    // 方法的覆盖(重写)
    class SmartTelevision extends Television {
      @override
      void turnOn() {...}
      // ···
    }
    

    运算符的覆盖(自定义运算符)

    class Vector {
      final int x, y;
      Vector(this.x, this.y);
      Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
      Vector operator -(Vector v) => Vector(x - v.x, y - v.y);
      // Operator == and hashCode not shown. For details, see note below.
      // ···
    }
    void main() {
      final v = Vector(2, 3);
      final w = Vector(2, 2);
      assert(v + w == Vector(4, 5));
      assert(v - w == Vector(0, 1));
    }
    

    noSuchMethod 方法的覆盖(重写)

    class A {
      // Unless you override noSuchMethod, using a
      // non-existent member results in a NoSuchMethodError.
      @override
      void noSuchMethod(Invocation invocation) {
        print('You tried to use a non-existent member: ' +
            '${invocation.memberName}');
      }
    }
    

    扩展方法

    import 'string_apis.dart';
    ...
    print('42'.padLeft(5)); // Use a String method.
    print('42'.parseInt()); // Use an extension method.
    

    枚举类型

    enum Color { red, green, blue }
    // 每个枚举值都有一个 index getter
    assert(Color.red.index == 0);
    assert(Color.green.index == 1);
    assert(Color.blue.index == 2);
    // values 返回所有枚举值
    List<Color> colors = Color.values;
    assert(colors[2] == Color.blue);
    // 使用 switch 语句匹配枚举
    var aColor = Color.blue;
    switch (aColor) {
      case Color.red:
        print('Red as roses!');
        break;
      case Color.green:
        print('Green as grass!');
        break;
      default: // Without this, you see a WARNING.
        print(aColor); // 'Color.blue'
    }
    

    混入

    // 使用混入
    class Musician extends Performer with Musical {
      // ···
    }
    class Maestro extends Person
        with Musical, Aggressive, Demented {
      Maestro(String maestroName) {
        name = maestroName;
        canConduct = true;
      }
    }
    // 定义混入
    mixin Musical {
      bool canPlayPiano = false;
      bool canCompose = false;
      bool canConduct = false;
    
      void entertainMe() {
        if (canPlayPiano) {
          print('Playing piano');
        } else if (canConduct) {
          print('Waving hands');
        } else {
          print('Humming to self');
        }
      }
    }
    // 只有某些类型才能使用的混入
    mixin MusicalPerformer on Musician {
      // ···
    }
    

    类变量和类方法

    // 静态变量
    class Queue {
      static const initialCapacity = 16;
      // ···
    }
    void main() {
      assert(Queue.initialCapacity == 16);
    }
    // 静态方法
    import 'dart:math';
    class Point {
      double x, y;
      Point(this.x, this.y);
    
      static double distanceBetween(Point a, Point b) {
        var dx = a.x - b.x;
        var dy = a.y - b.y;
        return sqrt(dx * dx + dy * dy);
      }
    }
    void main() {
      var a = Point(2, 2);
      var b = Point(4, 4);
      var distance = Point.distanceBetween(a, b);
      assert(2.8 < distance && distance < 2.9);
      print(distance);
    }
    
  • 相关阅读:
    选择排序遇到的引用和传值问题记录
    The web application [ROOT] appears to have started a thread named [spring.cloud.inetutils] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
    IDEA中实用的插件
    Column 'status' specified twice
    Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'dataType' in 'field list'
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where id = 2' at line 8
    Missing URI template variable 'id' for method parameter of type long
    值传递和引用传递的区别
    SpringBoot项目与数据库交互,访问http://localhost:8888/admin/userInfo时,报org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
    SpringBoot项目启动时报错:org.apache.catalina.LifecycleException: Protocol handler start failed
  • 原文地址:https://www.cnblogs.com/zwvista/p/13666351.html
Copyright © 2020-2023  润新知