【Flutter】Dart 面向对象 ( 命名构造方法 | 工厂构造方法 | 命名工厂构造方法 )

举报
韩曙亮 发表于 2022/01/11 01:42:43 2022/01/11
【摘要】 文章目录 一、 命名构造方法二、 工厂构造方法三、 命名工厂构造方法四、 相关资源 一、 命名构造方法 命名构造方法 : 定义格式 : 类名.方法名() Stu...





一、 命名构造方法



命名构造方法 :

  • 定义格式 : 类名.方法名()
Student.cover(Student student):super(student.name, student.age);

  
 
  • 1
  • 父类构造函数 : 如果父类没有默认构造函数, 子类必须调用父类的构造函数 ;
  • 方法体 : 命名构造方法与普通构造函数一样 , 可以有方法体 , 也可以不写方法体 ;
  // 命名构造方法也可以有方法体
  Student.init(Student student):super(student.name, student.age){
    print("命名构造方法 : name : ${student.name}, age : ${student.age}");
  }

  
 
  • 1
  • 2
  • 3
  • 4

代码示例 :

// 定义 Dart 类
// 与 Java 语言类似, 所有的类默认继承 Object 类
class Person{

  // 定义变量
  String name;
  int age;

  // 标准构造方法, 下面的方法是常用的构造方法写法
  Person(this.name, this.age);

  // 重写父类的方法
  @override
  String toString() {
    return "$name : $age";
  }
}

// 继承
class Student extends Person{

  // 命名构造方法
  // 定义格式 : 类名.方法名()
  // 父类构造函数 : 如果父类没有默认构造函数, 子类必须调用父类的构造函数
  Student.cover(Student student):super(student.name, student.age);

  // 命名构造方法也可以有方法体
  Student.init(Student student):super(student.name, student.age){
    print("命名构造方法 : name : ${student.name}, age : ${student.age}");
  }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32




二、 工厂构造方法



工厂构造方法就是 单例模式 , 工厂构造方法作用是返回之前已经创建的对象 , 之前创建对象时需要缓存下来 ;

工厂构造方法规则 : 在构造方法前添加 factory 关键字 ;


定义了工厂构造方法的类 :

// 使用工厂构造方法实现单例模式
// 工厂构造方法就是单例模式
// 工厂构造方法作用是返回之前已经创建的对象 , 之前创建对象时需要缓存下来 ;
class Student2{
  // 静态成员
  static Student2 instace;

  // 工厂构造方法
  factory Student2(){
    if(instace == null){
      // 调用命名构造方法创建 Student2 对象
      instace = Student2.init();
    }
    // 返回单例对象
    return instace;
  }

  // 命名构造方法
  Student2.init();
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

测试工厂构造方法 :

  factoryConstructorDemo(){
    Student2 stu1 = Student2();
    print("stu1 创建完成 : ${stu1}");
    Student2 stu2 = Student2();
    print("stu2 创建完成 : ${stu2}");

    print("对比 stu1 与 stu2 : stu1 == stu2 : ${stu1 == stu2}");
  }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

执行结果 :

I/flutter (32158): stu1 创建完成 : Instance of 'Student2'
I/flutter (32158): stu2 创建完成 : Instance of 'Student2'
I/flutter (32158): 对比 stu1 与 stu2 : stu1 == stu2 : true

  
 
  • 1
  • 2
  • 3




三、 命名工厂构造方法



命名工厂构造方法格式 :

factory 类名.方法名

  
 
  • 1

命名工厂构造方法可以有 返回值 ;

如果类中有 final 修饰的成员 , 在命名构造方法中必须对其进行初始化 ;

但是在命名工厂构造方法中 , 可以不初始化 final 类型成员


命名工厂构造方法示例 :

// 继承
class Student extends Person{

  // 私有变量, 以下划线开始的变量是私有变量
  int _grade;

  String school;
  String city;
  String address;

  // 父类构造函数调用 : 如果父类有非空参数的构造函数, 子类必须实现相同参数的构造函数
  // 如果该类有父类 , 那么先调用父类的构造方法 , 完成父类的初始化
  // 然后才能完成自己的初始化
  //
  // this.school 指定自有参数
  // {this.school} 是可选参数, 可选参数必须在构造函数参数列表中最后一个
  //
  // 默认参数 : 可选参数中如果用户不初始化该可选参数 , 那么为其指定一个默认值
  // {this.city = "北京"} 指定了如果用户不初始化 city 变量, 那么为其初始化 "北京" 字符串值
  //
  // 初始化列表 : 冒号后面的内容就是初始化列表
  //            父类构造器也是初始化列表
  //            除了父类构造方法之外 , 还可以在子类构造方法体之前初始化示例变量
  //            不同的初始化实例变量之间使用逗号隔开
  //
  // 父类构造方法 : 如果父类没有默认构造方法 (无参构造方法) ,
  //              必须在初始化列表中调用父类构造函数 , super(name, age) ;
  //
  // 构造方法方法体 : 可以省略 ;
  Student(this._grade, String name, int age,
         {this.school, this.city = "北京"})
         : address = "北京市海淀区" ,
         super(name, age);


  // 命名构造方法
  // 定义格式 : 类名.方法名()
  // 父类构造函数 : 如果父类没有默认构造函数, 子类必须调用父类的构造函数
  Student.cover(Student student):super(student.name, student.age);

  // 命名构造方法也可以有方法体
  Student.init(Student student):super(student.name, student.age){
    print("命名构造方法 : name : ${student.name}, age : ${student.age}");
  }

  // 命名工厂构造方法 : factory 类名.方法名
  // 命名工厂构造方法可以有返回值
  // 如果类中有 final 修饰的成员 , 在命名构造方法中必须对其进行初始化
  //    但是在命名工厂构造方法中 , 可以不初始化 final 类型成员
  factory Student.init2(){
    return Student(1, "Tom", 18);
  }

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54




四、 相关资源



参考资料 :


博客源码下载 :

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/113746569

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。