美文网首页Flutter
Dart面向对象编程一

Dart面向对象编程一

作者: RobinZhao | 来源:发表于2019-04-11 19:39 被阅读0次

Dart是面向对象的语言,第一部分主要内容:

  • 类与对象,声明、创建及基本特性
  • 构造方法及初始化列表
  • 静态成员及对象操作符的使用

属性和方法

  • 属性默认会生成getter和setter方法
  • 使用final声明的属性只有getter方法,即使用final声明的属性只可读不可写
  • 属性和方法通过.访问
  • 方法不能被重载

计算属性

  • 顾名思义,计算属性的值是通过计算而来的,本身不储存值
  • 计算属性赋值,其实是通过计算转换到其他实例变量
void test() {
  var rect = Rectangle();
  rect.width = 10;
  rect.height = 20;
  print(rect.area);
  
  rect.area = 200;
  print(rect.width);
}

class Rectangle {
  num width, height;
  num get area => width * height; // 计算属性,得到值
  set area(value) { // 计算属性 ,设置值
    width = value / (height ?? 1);
  }
}

构造方法

  • 如果没有自定义构造方法,则会有一个默认的构造方法
  • 如果存在自定义构造方法,则默认的构造方法无效
  • 构造方法不能重载

命名构造方法

  • 使用命名构造方法,可以实现多个构造方法
  • 使用类名.方法的形式实现
void test() {
  var person = Person('Tom', 20);
  var person1 = Person.withName("Robin");
  Person.withAge(20);
}
// 构造方法
class Person {
  String name;
  int age;
  final String gender = '';
  // Person() {} // 默认构造方法,可以省略
  // Person(String name,int age){
  //   this.name = name;
  //   this.age = age;
  // }
  // 上面构造方法和下面的等价,Dart的语法糖的形式 语法糖构造方法是在构造方法之前就已经给属性赋值了
  Person(this.name,this.age);
  Person.withName(String name) {
    this.name = name;
  }
  // 上面构造方法也可以用语法糖
  Person.withAge(this.age);
  void work() {
    print('work...');
  }
}

常量构造方法 -在开发中更快,因为在编译的时候就已经确定了

  • 如果类是不可变状态,可以把对象定义为编译时常量
  • 使用const声明构造方法,并且所有的变量都为final
  • 使用const声明对象,可以省略
void ptest() {
  const person = Person('Robin', 18, 'Male');
  /// 'age' can't be used as a setter because it is final
  person.age = 10;
}

class Person {
  final String name;
  final int age;
  final String gender;
  const Person(this.name,this.age,this.gender);
  void work() {
    print('work...');
  }
}

工厂构造方法

  • 工厂构造方法类似于设计模式中的工厂模式
  • 在够造方法前添加关键字factory实现一个工厂构造方法
  • 和其他构造方法不同,在工厂构造方法中可以返回对象
// 官网例子
class Logger {
  final String name;
  static final Map<String,Logger> _cache = <String,Logger>{};
  factory Logger(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final logger = Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }
  Logger._internal(this.name);
  // Logger._internal(this.name){
    // return Text('data'); // 非工厂构造方法是不可以返回对象的 tips:Constructors can't return values.
  // }
  void log(String msg) {
    print(msg);
  }
}

初始化列表

  • 初始化列表会在构造方法执行之前执行
  • 使用逗号分隔初始化表达式
  • 初始化列表常用于设置final变量的值 当然设置非final也是可以的
class Person2 {
  String name;
  int age;
  final String gender;
  Person2(this.name,this.age,this.gender);
  /// 初始化列表
  Person2.withMap(Map map):gender = map['gender'] {
    print('$name $age $gender ...'); // null null Fmale ...
    name = map['name'];
    age = map['age'];
  }
  void work() {
    print('$name $age $gender work...'); // Tom 19 Fmale work...
  }
}

静态成员

  • 静态成员即可是方法也可以是属性
  • 使用static关键字来实现类级别的变量和函数
  • 静态成员不能访问非静态成员,非静态成员可以访问静态成员
  • 类中的常量需要使用static const 声明
class Page {
  static int currentPage = 1;
  // 下滑
  static void scrollDown() {
    currentPage = 1;
    print('ScrollDown...');
  }
  void scrollUp() {
    currentPage++;
    print('ScrollUp...');
  }
}

对象操作符

Person类:

class Person {
  String name;
  int age;
  void work() {
    print('$name $age work...');
  }
}

  • 条件成员的访问:?.

    Person person;
    person?.work(); // 在执行work()时,判断person是否为空,为空就不执行work(),不为空才会执行work()
    person?.name;
    
  • 类型转换:as

    var person;
    person = 'person';
    person = Person();
    (person as Person).work();
    
  • 是否是指定类型:is,is!

    var person;
    person = 'person';
    if (person is Person) {
        person.work();
    }
    if (person is! Person3) {
    
    }
    
    
  • 级联操作:..

    var person = Person3();
    person..name = 'Tom'  // 给name赋值,然后返回的还是当前对象
        ..age = 20
        ..work();
    Person3()..name = 'Robin'
        ..age = 20
        ..work();
    
    

对象call方法

  • 如果类实现了call()方法,则该类的对象可以作为方法使用

    class CallMethod {
      String call(String name,int age) {
        return 'name:$name and age:$age';
      }
    }
    
    var callMethod = CallMethod();
    print(callMethod('robin',10));
    
    

相关文章

  • (六)Dart Classes(类)、Constructors(

    一、Object(对象) Dart 是一个面向对象编程语言。 Dart支持基于 mixin 的继承机制(多继承)。...

  • 基础学习

    1.第一个世界级程序 Dart面向对象编程 Dart是一种面向对象的语言。面向对象是一种遵循真实世界建模的软件开发...

  • Dart面向对象编程一

    Dart是面向对象的语言,第一部分主要内容: 类与对象,声明、创建及基本特性 构造方法及初始化列表 静态成员及对象...

  • Dart面向对象编程(一)

    类与对象 使用关键字class声明一个类 使用关键字new创建一个对象,new可以省略 所有对象都继承Object...

  • Dart-语法二

    面向对象特性 1.类(class ) Dart是一个面向对象编程语言,同时支持基于mixin的继承机制。每个对象都...

  • Dart语言基础特性

    概述 Dart是Google发布的开源语言 Dart是面向对象编程语言 Dart目前可用于全平台开发(Web开发,...

  • 一文了解Dart语法

    前言 Flutter应用程序使用Dart语言开发,Dart是面向对象编程语言,由Google于2011年推出,目前...

  • 第二章 Flutter开发 - Dart语言

    前言 Flutter应用程序使用Dart语言开发,Dart是面向对象编程语言,由Google于2011年推出,为了...

  • Flutter开发-Dart语言基础-1

    Dart是一种易于学习,易于扩展,并且可以部署到任何地方的应用编程语言.Dart是面向对象的编程语言,由Googl...

  • dart编程语言快速入门 (通过10个例子快速了解基本语法)

    dart编程语言快速入门 (通过10个例子快速了解基本语法) dart是一门面向对象的,单继承的单线程编程语言. ...

网友评论

    本文标题:Dart面向对象编程一

    本文链接:https://www.haomeiwen.com/subject/ysixwqtx.html