Flutter类

news2024/9/21 22:31:36

Dart中的对象都继承自 Object 类,单继承(extend关键字)。Dart与Java、kotlin不同的是其无public、private、protected修饰符,默认public ,通过在属性名、方法名前加 _下划线 来定义是否私有。

实现一个简单的类

class Student {
  //默认public
  final String name;
  //默认public
  final int age;

  Student(this.name, this.age);

  @override
  bool operator ==(Object other) {
    return identical(this, other) ||
        other is Student &&
            runtimeType == other.runtimeType &&
            name == other.name &&
            age == other.age;
  }

  @override
  int get hashCode => name.hashCode ^ age.hashCode;
}
import 'package:gsy_flutter_demo/model/Student.dart';

main() {
  var stu = Student("Jack", 18);
  stu.name;
  stu.age;
}

在属性名、方法名前加 _下划线 来定义私有属性。

class Person {
  String _name = "jack";
  int _age = 18;
}

 

定义私有属性和方法的类需要抽离放到一个单独的文件或者模块中。否则不会生效,例如写在同一个文件中,仍然可以访问私有属性。

class Person {
  String _name = "jack";
  int _age = 18;
}

main() {
  var person = Person();
  person._name;
  person._age;
}

 类定义&使用

与Java、Kotlin一样,使用 class 关键字定义一个类。实例化可以使用new关键字创建,也可以省略。

class Student {
  final String name;
  final int age;

  Student(this.name, this.age);

  @override
  bool operator ==(Object other) {
    return identical(this, other) ||
        other is Student &&
            runtimeType == other.runtimeType &&
            name == other.name &&
            age == other.age;
  }

  @override
  int get hashCode => name.hashCode ^ age.hashCode;
}

 var stu = Student("Jack", 18);

 var stu2 = Student("Mike", 20);

构造函数

构造函数有四种形式:类名构造函数、命名构造函数、常量构造函数、工厂构造函数。
定义一个类,默认会有一个 无参构造函数,如果有父类,还会调用父类的无参构造函数。


类名构造函数

 Student(this.name, this.age);

命名构造函数(类名.修饰符 定义的函数)

  Student.create(String name) : this(name, 20);

注意:命名构造函数不可继承。

常量构造函数

如果类创建的对象不会改变,就可以在编译期就创建这个常量实例,并定义一个常量构造函数,并且确保所有成员变量都是final的。

//常量构造函数  
const Student(this.name, this.age);

工厂构造函数

工厂构造函数,构造函数私有,使用 factory 关键字进行定义,根据不同情况创建不同的对象。

class Fruit {
  final double price;
  final int weight;
  final String name;

  Fruit._(this.price, this.weight, this.name);

  //宸ュ巶鏋勯€犲嚱鏁版病鏈夎闂潈闄?
  factory Fruit(String name) {
    if (name == 'apple') {
      return Fruit._(12, 5, name);
    } else if (name == 'pear') {
      return Fruit._(15, 5, name);
    }
    return Fruit._(100, 100, name);
  }

get/set修饰符

class Fruit {
  final double price;
  final int weight;
  final String name;

  Fruit._(this.price, this.weight, this.name);

  //宸ュ巶鏋勯€犲嚱鏁版病鏈夎闂潈闄?
  factory Fruit(String name) {
    if (name == 'apple') {
      return Fruit._(12, 5, name);
    } else if (name == 'pear') {
      return Fruit._(15, 5, name);
    }
    return Fruit._(100, 100, name);
  }

  int? get fruitWeight => weight;

  set price(double price) {
    this.price = price;
  }

对象操作符

类型强转 as

Fruit apple = Fruit("apple");
int weight = (apple as Fruit).fruitWeight ?? 0;

类型判断 is

  if (apple is Fruit) {
    print("apple");
  }

级联操作 ..

apple
    ..price = 100.0
    ..weight = 100
    ..name = "Fruit";
class Fruit {
  final double price;
  late final int weight;
  late final String name;

  Fruit._(this.price, this.weight, this.name);

  
  factory Fruit(String name) {
    if (name == 'apple') {
      return Fruit._(12, 5, name);
    } else if (name == 'pear') {
      return Fruit._(15, 5, name);
    }
    return Fruit._(100, 100, name);
  }

  int? get fruitWeight => weight;

  set price(double price) {
    this.price = price;
  }
}

main() {
  Fruit apple = Fruit("apple");
  int weight = (apple as Fruit).fruitWeight ?? 0;

  if (apple is Fruit) {
    print("apple");
  }
  apple
    ..price = 100.0
    ..weight = 100
    ..name = "Fruit";

 

继承

子类使用 extends 关键字继承父类,子类会继承父类的属性和方法 (构造方法除外),使用 super 关键字调用父类属性/方法,或者给父类构造方法传参。

class Animal {
  late String name;
  late int type;

  Animal(this.name, this.type);
}

class Tiger extends Animal {
  int weight;

  Tiger(super.name, super.type, this.weight);
}

接口和抽象类

接口的作用:解决多继承的二义性问题。即指的是多继承中方法和属性名称的冲突,编译器无法确定使用哪个父类的方法和属性。在Dart中,无interface关键字,所有类都被隐式定义成一个接口,任何类都可以作为接口被实现。Dart解决多继承、实现的二义性问题:子类必须将父类中所有属性和方法全部重写。

接口简单Demo

class DemoA {
  int num;

  DemoA(this.num);

  void printDemo() => print("DemoA");
}

class DemoB {
  int num;

  DemoB(this.num);

  void printDemo() => print("DemoB");
}

class DemoC implements DemoA, DemoB {
  @override
  int num = 6;

  @override
  void printDemo() {
    print("DemoC");
  }
  
}

注意:Java中的限制:接口中只能定义抽象成员和方法,且强制子类必须实现。

抽象类简单Demo

Dart中的抽象类不能被实例化,但可以包含 抽象方法  和 非抽象方法。

abstract class DemoA {
  String demoName;

  DemoA(this.demoName);

  void doA();

  void showA();

  void printA() {
    print("DemoA");
  }
}

abstract class DemoB {
  String demoBName = "DemoB";

  void doDemoB();

  void showDemoB();

  void printDemoB() {
    print("DemoB");
  }
}

class RealDemo implements DemoA, DemoB {
  @override
  String demoBName = "RealDemo";

  @override
  String demoName = "RealDemo";

  @override
  void doA() {}

  @override
  void doDemoB() {}

  @override
  void printA() {}

  @override
  void printDemoB() {}

  @override
  void showA() {}

  @override
  void showDemoB() {}
}
class RealDemo extends DemoA implements DemoB {
  @override
  String demoBName = "demoBName";

  RealDemo(super.demoName);
  
  @override
  void doA() {}

  @override
  void doDemoB() {}

  @override
  void printDemoB() {}

  @override
  void showA() {}

  @override
  void showDemoB() {}
}

Mixins

Dart中使用with关键字,将一个类的功能添加到另一个类中 (该类可以复用其中的方法和属性),从而能实现多继承。mixin 关键字来定义一个混入类。

mixin Run {
  void run() => print("run");
}

class Animal {}

mixin Swim on Animal {
  void swim() => print("swim");
}

class Tiger with Run {}

class Fish extends Animal with Swim, Run {

}

main() {
  var fish = Fish();
  fish.swim();
  fish.run();

  var tiger = Tiger();
  tiger.run();
}
swim
run
run

注意: on子句 指定该mixin可以混入的类类型,只能混入到继承了Animal的类中。

枚举和密封类

Dart使用enum关键字定义枚举类型,枚举中的成员都有一个对应的索引值(这个值从0开始)。

枚举简单Demo

enum VALUE { VALUE_A, VALUE_B, VALUE_C }

main() {

  for (var elemntValue in VALUE.values) {
    print(elemntValue);
  }
}
VALUE.VALUE_A
VALUE.VALUE_B
VALUE.VALUE_C

枚举支持 扩展方法

enum VALUE { VALUE_A, VALUE_B, VALUE_C }

extension VALUE_OPERATE on VALUE {
  static VALUE getValueByIndex(int index) => VALUE.values[index];
}

main() {
  var value = VALUE_OPERATE.getValueByIndex(1);
  print(value);
}
VALUE.VALUE_B

增强型枚举

enum Month {
  January(str: "January", num: 1),
  February(str: "February", num: 1),
  March(str: "March", num: 1),
  April(str: "April", num: 1),
  May(str: "May", num: 1),
  June(str: "June", num: 1),
  July(str: "July", num: 1),
  August(str: "August", num: 1),
  September(str: "September", num: 1),
  October(str: "October", num: 1),
  November(str: "November", num: 1),
  December(str: "December", num: 1);

  const Month({required this.str, required this.num});

  final String str;
  final int num;
}

main() {
  print(Month.December.str);
}

 

December

 密封类

与Kotlin类似,使用 sealed 关键字进行修饰,用于限制类的结构层次结构。

sealed class Status {}

class StatusA extends Status {}

class StatusB extends Status {}

class StatusC extends Status {}

String getStatusStr(Status status) {
  return switch (status) {
    StatusA() => "StatusA",
    StatusB() => "StatusB",
    StatusC() => "StatusC"
  };
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120597.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python(TensorFlow和PyTorch)两种显微镜成像重建算法模型(显微镜学)

🎯要点 🎯受激发射损耗显微镜算法模型:🖊恢复嘈杂二维和三维图像 | 🖊模型架构:恢复上下文信息和超分辨率图像 | 🖊使用嘈杂和高信噪比的图像训练模型 | 🖊准备半合成训练集 | &…

基于单片机的水产养殖饲料自动投喂系统

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图系统框架图设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机…

基于SpringBoot的扶贫助农管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的扶贫助农管理系统【附源码文档…

《JavaEE进阶》----14.<SpringMVC配置文件实践之【验证码项目】>

本篇博客介绍的是Google的开源项目Kaptcha来实现的验证码。 这种是最简单的验证码。 也是很常见的一种验证码。可以去看项目结果展示。就可以明白这个项目了。 前言: 随着安全性的要求越来越高、很多项目都使用了验证码。如今验证码的形式也是有许许多多、更复杂的图…

(有直接运行的源码)SpringBoot-MyBatis in查询 <foreach> 范围查询, 以及其他方法查询

文章目录 第一种: names入参为数组,foreach标签遍历第二种: name入参是纯字符串, 代替数据中的内容需要的工具类第三种: name入参为纯字符串, foreach标签分割遍历第四种: mysql中使用 (待补充)第五种: 存储过程和函数,以及其他数据库(待补充)源代码地址第一种: names入参为数组…

王道考研操作系统笔记(一)

虚拟内存的定义和特征: 基于局部性的原理, 在程序装入时,可以将程序中很快用到的部分装入内存,暂时用不到的数据装入外存,就可以让程序开始执行,在程序执行过程中,当所访问的信息不在内存的时…

以租代卖+押金原路退回系统 阿雪技术观市场策划

一、市场目标 1. 提高软件的知名度和用户使用率。 2. 促进物品的流转和租赁,增加用户参与度和满意度。 3. 探索新的商业模式,为公司带来更多的收益和发展机会。 二、实施步骤 1. 软件平台搭建 - 开发和优化市场策划软件,确保其功能完善…

数据库系列之GaussDB数据库中逻辑对象关系简析

初次接触openGauss或GaussDB数据库的逻辑对象,被其中的表空间、数据库、schema和用户之间的关系,以及授权管理困惑住了,与熟悉的MySQL数据库的逻辑对象又有明显的不同。本文旨在简要梳理下GaussDB数据库逻辑对象之间的关系,以加深…

【高级编程】Java IO流(上)字节流 InputStream OutputStream

文章目录 文件操作流输入流InputStream输出流OutputStream 文件操作 文件是指相关记录或放在一起的数据的集合。是一种用于存储数据的基本单位,它可以包含各种类型的信息,例如文本、图像、音频或视频。文件在计算机中通常存储在磁盘或其他存储介质上&am…

华为OD机试 - 最大相连男生数 - 矩阵(Java 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

SprinBoot+Vue健康健身追踪系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

基于SpringBoot+Vue社区家政服务预约平台【提供源码+答辩PPT+参考文档+项目部署】

项目技术架构: 该家政服务预约平台基于B/S架构,后端采用SpringBoot架构,前端采用VueElementUI技术,并结合MySQL数据库。该系统分为系统管理员、家政人员、雇主用户三种角色。 系统核心功能: 用户管理、家政人员管理…

Zenmap

Zenmap Zenmap 本身作为一款端口扫描的工具无法直接判断一台服务器是否存在具体的漏洞,但它可以帮助你识别服务器上的开放端口、运行的服务以及操作系统信息,通过这些信息,需要你自己凭借经验推测可能存在的漏洞,或者结合其他工具…

微服务CI/CD实践(六)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)服务器先决准备 微服务CI/CD实践(三)gitlab部署及nexus3部署 微服务CI/CD实践(四&#xff09…

log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈

日志是项目中必用的东西,日志产品里最普及应该就是log4j了。(logback这里暂不讨论。) 先看一下常用的log4j的用法,一般来说log4j都会配合slf4j或者common-logging使用,这里已slf4j为例。添加gradle依赖: dependencies { compile(l…

When is a Liability not a Liability

When is a Liability not a Liability? Textual Analysis, Dictionaries, and 10-Ks(2011) 论文阅读 文章目录 When is a Liability not a Liability? Textual Analysis, Dictionaries, and 10-Ks(2011) 论文阅读 Abstract哈佛H4N List 与 Fin-Neg如何创建词汇列表&#xff1…

声音克隆工具CosyVoice

阿里的免费声音克隆工具CosyVoice CosyVoice 是阿里通义实验室在七月初开源的一款专注于自然语音合成的语音大模型,它具备多语言、多音色和细腻的情感控制能力。这个系统支持中文、英文、日文、粤语和韩语五种语言的语音生成,并且在语音合成的效果上远超…

【python】SemEval 2014数据集 xml文件格式转换为csv+txt

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【python】SemEval 2014数据集 xml文件格式转换为csvtxt SemEval2014简介4个子任务数据格式xml转csvxml转txt SemEval2014简介 SemEval2014,ABSA( Aspect Based Sentiment Analysis&#…

Dance with Compiler - EP3 ARM64 汇编传参约定以及 restrict 汇编分析

在 ARM64 架构(也称为 AArch64)中,函数调用约定定义了寄存器如何用于传递参数和返回值。这些约定有助于实现高效的函数调用和返回。在 ARM64 的汇编中,寄存器传参遵循以下约定: 参数传递寄存器 x0 - x7: 这 8 个寄存器…

Golang | Leetcode Golang题解之第396题旋转函数

题目: 题解: func maxRotateFunction(nums []int) int {numSum : 0for _, v : range nums {numSum v}f : 0for i, num : range nums {f i * num}ans : ffor i : len(nums) - 1; i > 0; i-- {f numSum - len(nums)*nums[i]ans max(ans, f)}return…