Flutter类

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

实现一个简单的类

class Student {//默认publicfinal String name;//默认publicfinal int age;Student(this.name, this.age);@overridebool operator ==(Object other) {return identical(this, other) ||other is Student &&runtimeType == other.runtimeType &&name == other.name &&age == other.age;}@overrideint 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);@overridebool operator ==(Object other) {return identical(this, other) ||other is Student &&runtimeType == other.runtimeType &&name == other.name &&age == other.age;}@overrideint 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 {@overrideint num = 6;@overridevoid 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 {@overrideString demoBName = "RealDemo";@overrideString demoName = "RealDemo";@overridevoid doA() {}@overridevoid doDemoB() {}@overridevoid printA() {}@overridevoid printDemoB() {}@overridevoid showA() {}@overridevoid showDemoB() {}
}
class RealDemo extends DemoA implements DemoB {@overrideString demoBName = "demoBName";RealDemo(super.demoName);@overridevoid doA() {}@overridevoid doDemoB() {}@overridevoid printDemoB() {}@overridevoid showA() {}@overridevoid 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.mzph.cn/web/52641.shtml

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

相关文章

pod被驱逐追溯根因

背景 收到pod报警,看到其状态是error,新的pod又在另外一台机器上起来了。 原因分析 describe pod看到pod被驱逐 Status: Failed Reason: Evicted Message: The node was low on resource: ephemeral-storage. Containe…

逆元(模板)

1.费马小定理 #include<bits/stdc.h> using namespace std; #define int long long int ksm(int x,int y,int p){int ans1;while(y){if(y&1) ansans*x%p;xx*x%p;y>>1;}return ans; } signed main() {//求 n 在 p 下的逆元&#xff0c;p 必须是质数int n,p;ci…

数据结构之红黑树的 “奥秘“

目录&#xff1a; 一.红黑树概念 二. 红黑树的性质 三.红黑树的实现 四.红黑树验证 五.AVL树和红黑树的比较 一.红黑树概念 1.红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何 一条从根…

YOLO配合 PYQT做自定义虚拟电子围-自定义绘制多边形虚拟电子围栏

电子围栏标注以及显示 1、目标检测&#xff1a; YOLO可以识别检测物体&#xff0c;这是众所周知的。使用YOLO来做目标检测&#xff0c;并获取坐标信息。 2、电子围栏 比如在监控中&#xff0c;指定一块区域&#xff0c;如果有目标进入&#xff0c;则发出警报&#xff0c;并提…

《基于深度半监督学习的目标检测综述》泛读

基于深度半监督学习的目标检测方法分为 1、生成式方法 2、一致性正则化方法 3、基于图的方法 4、伪标记方法和混合方法 然后基于常用数据集 对典型方法进行了性能对比&#xff0c;最后分析了其挑战和发展趋势&#xff0c;旨在为相关研究提供参考 收获就是&#xff1a; 1…

JMeter 入门之远程启动,服务模式,多机联测,负载均衡测试

本文主要介绍 JMeter 远程启动及使用多节点完成大并发测试&#xff08;负载均衡测试&#xff09;&#xff0c;主打一个压力山大&#xff0c;借用 黑神话&#xff1a;悟空 的技能来描述就是远程开大&#xff0c;释放猴子猴孙技能。 搜了一些 jmeter 的案例或教程&#xff0c;讲的…

MyBatis-Plus分页查询、分组查询

目录 准备工作1. 实体类2. Mapper类3. 分页插件4. 数据 分页查询1. 使用条件构造器2. 使用自定义sql 分组查询1. 分组结果类2. 自定义sql3. 测试类 准备工作 1. 实体类 对地址字段address使用字段类型转换器&#xff0c;将List转为字符串数组保存在数据库中 package com.exa…

计算机网络基础概念 交换机、路由器、网关、TBOX

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么&#xff1f;二 、交换机三、路由器四、网关五、TBOX六、问题1 、网关和交换机的区别2、网关和路由器的区别 总结 前言 工作有感而发&#xff0…

Docker 部署 Redis (图文并茂超详细)

部署 Redis ( Docker ) [Step 1] : 拉取 Redis 镜像, 推荐使用 7 的 Redis 版本 docker pull redis:7.0.12[Step 2] : 创建 Redis 相关目录 ➡️ 启动 Redis 容器 ➡️ 拷贝文件 ➡️ 授权文件夹 ➡️ 删除容器 # 创建 Redis 相关目录 mkdir -p /data/redis/{conf,data,log…

探索Python中文拼音转换的奥秘:xpinyin库

文章目录 **探索Python中文拼音转换的奥秘&#xff1a;xpinyin库**背景介绍库简介安装指南函数使用示例应用场景常见问题与解决方案总结 探索Python中文拼音转换的奥秘&#xff1a;xpinyin库 背景介绍 在处理中文文本数据时&#xff0c;我们经常需要将中文字符转换为拼音。无…

【LabVIEW学习篇 - 23】:简单状态机

文章目录 简单状态机状态机的创建和了解状态机实现红绿灯 简单状态机 一个优秀的应用程序离不开好的程序框架&#xff0c;不仅要很好满足用户的功能需求&#xff0c;还要考虑到系统的稳定性、实时性、可扩展性、可维护性&#xff0c;执行效率等方面。借用一些成熟的设计框架&a…

【C++】string类的基本使用

一、string类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列 的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户 自己管…

MBD_入门篇_23_SimulinkSinks

23.1 概述 Sink库里面是Simulink的显示或导出信号数据的模块&#xff0c;可以理解为信号的最后接收的模块&#xff0c;要么用于显示要么用于传递给更上层的系统要么终止。 Sink库里面的模块都只有输入&#xff0c;没有输出。 23.2 回顾常用模块 23.2.1 Display 用于实时仿真…

Computer Exercise

每日一练 单选题 在Word2003中&#xff0c;通过&#xff08;     D    &#xff09;不能设置字符格式。 A.格式菜单     B.格式工具栏     C.格式刷     D.常用工具栏数据库系统而言&#xff0c;主要通过权限和授权来实现安全管理&#xff0c;其中update权限表示&am…

Java 21的Preferences API的笔记

Java Core LibrariesPreferences API 多用户环境下&#xff0c;应用程序保存配置参数的一种API&#xff0c;目前支持用户和系统两类配置。 在现有的项目中&#xff0c;目前没有使用过本API。Comparing the Preferences API to Other Mechanisms 通常&#xff0c;应用的开发者还…

数据库——MySQL概述

一、数据库 存储数据的仓库&#xff0c;数据是有组织的存储&#xff0c;简称database&#xff08;DB&#xff09; 二、数据库管理系统 操控和管理数据库的大型软件&#xff08;DBMS&#xff09; 三、SQL 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库…

Leetcode面试经典150题-134.加油站

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {/**如果只有一个加油站&#xff0c;那它本来就在那个为止&#xff0c;0就是它的编号?但是这只是你的想象&#xff0c;题目有个变态规定&#xff0c;自…

python-古籍翻译

题目描述 小理跑到外星人的图书馆去读书。有一本外星古籍&#xff0c;里面的内容是用八进制写成的&#xff1b;但小理只能处理十六进制的数据。请你帮忙写一个翻译软件&#xff0c;帮小理把八进制串翻译成十六进制串。 输入 仅一行&#xff0c;一个八进制字符串 s&#xff0…

创建Java项目,可实现main方法运行,实现对性能数据的处理

1、Android Studio无法执行Java类的main方法问题及解决方法 Android Studio无法执行Java类的main方法问题及解决方法_delegatedbuild-CSDN博客 D:\workspaces\performanceTools\.idea 文件夹下&#xff0c;gardle.xml ,添加依赖 <option name"delegatedBuild"…

QT:音视频播放器

目录 一.播放器设计 二.需要使用的控件 三.选择视频 四.播放视频 五.暂停视频 六.关闭视频 七.播放状态设置 八.切换视频(上一首) 九.切换视频(下一首) 十.设置视频滑块 十一.更新滑块显示 十二.实现效果 十三.代码设计 1.mainwindow.h 2.mainwindow.cpp 一.播放…