Flutter Dart语言(03)面向对象总结

0 说明

该系列教程主要是为有一定语言基础 C/C++的程序员,快速学习一门新语言所采用的方法,属于在C/C++基础上扩展新语言的模式。

1 面向对象基础知识

说明:这里主要是基于C++面向对象着门语言,分析与其不同的部分,属于扩展式的学习模式。Dart语言本身也是面向对象的程序语言,

编码习惯说明:类的首字母要大写,方法首字母小写。

1.1 类的属性信息获取

在dart语言中,属性的获取一般可以用$符号直接获取,这里以Person类为例,具体描述如下:

class Person {String name = 'wang';int age = 30;Person() {}void printInfo() {print("printInfo:");print("use \$ label");print("$name----$age");print("use this pointer");print("${this.name}----${this.age}");}
}void main() {Person p = new Person();p.printInfo();print("Person's property:");print("name=${p.name},age=${p.age}");
}

命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:63468/DKkz_f3A8aw=/ws
printInfo:
use $ label
wang----30
use this pointer
wang----30
Person's property:
name=wang,age=30

1.2 默认构造函数和命名构造函数

Dart中构造函数和C++中有所不同,并不是直接编写的构造函数有多个,而是一个默认构造函数和多个不同的命名构造函数,都可以用于对象的实例化,这里以Person类为例来解读默认构造函数和命名构造函数的差别,代码如下所示:

class Person {String name = 'wang';int age = 30;//1 默认构造函数,当实例化一个对象时,会自动调用到该函数//一般编码模式:// Person(String name, int age) {//   this.name = name;//   this.age = age;// }//Dart语言中的简写模式,功能同上 注释:Person(this.name, this.age);//2 命名构造函数系列Person.now() {print("命名构造函数now");}Person.init(String name) {this.name = name;print("命名构造函数init:$name");}void printInfo() {print("$name---$age");}
}void main() {Person p1 = new Person("wang", 30);Person p2 = new Person.now();Person p3 = new Person.init("li");p1.printInfo();p2.printInfo();p3.printInfo();
}

命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:63783/veW3pzv-NKs=/ws
命名构造函数now
命名构造函数init:li
wang---30
wang---30
li---30

1.3 私有(private)属性和公有(public)属性

这里的private变量一般使“ _ ”开头,而非“_”开头的变量一般都是public变量。代码如下所示:

class Person {//public属性String name = 'wang';//private属性//注意:必须在Person独立出的类文件中,才可以使private属性生效,否则无效int _age = 30;Person(this.name, this._age);void printInfo() {print("$name---$_age");}
}void main() {Person p1 = new Person("wang", 30);p1._age = 30;p1.printInfo();
}

但要非常注意:直接在该文件中使用时private属性并不生效,即外界依然可以访问。只有在独立类文件Person中时才会生效。命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:64385/Oid5LlpsVOg=/ws
wang---30

1.4 get和set 计算属性

get和set的使用,代码如下所示:

class Circle {double radius;Circle(this.radius);//getter实现// double s() {//   return radius * radius * 3.14;// }//{等价于上面的方法实现}//setter实现set setRadius(double radius) {this.radius = radius;}
}void main() {Circle c = new Circle(5.0);c.setRadius = 7.0;//setter的使用print("r=${c.radius},s=${c.s}");//getter的使用
}

命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:64936/um9Y1LlW7Zc=/ws
r=7.0,s=153.86

1.5 初始化操作

构建对象前的初始化变量操作,在构造函数运行前赋值,代码如下所示:

class Circle {double radius;//变量初始化操作。在构造函数运行前赋值Circle() : radius = 3.0 {print("r=${radius}");}get s {return this.radius * this.radius * 3.14;}
}void main() {Circle c = new Circle();print("r=${c.radius},s=${c.s}");
}

命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:65060/-cx0Vbd4POI=/ws
r=3.0
r=3.0,s=28.26

1.6 静态属性和静态方法

在Dart语言中一般使用static关键字来实现对变量和方法的描述。规则如下:

  • 静态方法中不能使用非静态方法和属性。
  • 非静态方法中可以使用静态方法和静态属性。

1.7 级联操作..

代码实现如下:

class Person {String name = 'wang';int age = 30;Person(this.name, this.age);void printInfo() {print("$name---$age");}
}void main() {Person p1 = new Person("wang", 30);//级联操作赋值p1..name = "wang-5"..age = 40..printInfo();
}

命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:50341/2a365aWm2oY=/ws
wang-5---40

常量构造函数

2 面向对象(继承、封装、多态)

2.1 抽象类和抽象方法

这里的描述主要针对相比C++语言的抽象类中不同之处,做对比学习,如下:

  • 抽象类主要用于定义标准。使用abstract关键字,抽象类中的抽象方法则无需再使用abstract关键字来声明。
  • 抽象类中如果只声明方法但不实现则是抽象方法,即没有方法体的方法就是抽象方法了。如果实现了的方法就是普通方法,即有方法体的方法。

抽象类及对应方法 代码实现如下:

//抽象类
abstract class Animal {//抽象类中的抽象方法void eat();void run();//抽象类中的一般方法void printInfo() {print("class Animal info");}
}

2.2 implements接口

Dart中没有关键字来定义接口的关键字,普通类和抽象类都可以作为接口被实现,使用关键字implements关键字进行实现。如果实现的类是普通类,需要将普通类和抽象中的属性和方法全重写。抽象类可以定义抽象方法,普通类不可以,所以一般如果要实现接口的方式,使用抽象类定义接口。这里要注意extends和implemnets的区别:在Dart语言中,继承抽象类 和实现抽象类是不同的,继承只会重写抽象类里的抽象方法,而实现会重写抽象类里的所有变量和方法。相关代码如下所示:

//复用上一段代码的Animal。。。//继承:只需要重写抽象类中的抽象方法
class Cat extends Animal {@overridevoid eat() {// TODO: implement eat}@overridevoid run() {// TODO: implement run}
}
//实现需要重写抽象类中的所有属性和方法
class Dog implements Animal {@overridelate String name;@overridevoid eat() {// TODO: implement eat}@overridevoid printInfo() {// TODO: implement printInfo}@overridevoid run() {// TODO: implement run}}

说明:如果是implements实现多个抽象类,则需要重写多个抽象类里的所有变量和方法。

2.3 mixins功能

主要用于实现类似多继承的功能。mixins的使用条件随着Dart的版本不断更新而有所改,mixins 3.X版本中约束条件如下:

  • 作为mixins的类只能继承自Object,不能继承其他类
  • 作为mixins的类不能有构造函数
  • 一个类可以mixins多个mixins类
  • mixins不是继承,也不是接口,而是一种全新的特性

代码实现如下所示:

mixin A {//作为minxins类,只能继承自ObjectprintA() {print("This is A");}run() {print("run A");}
}mixin B {//作为minxins类,只能继承自ObjectprintB() {print("This is B");}run() {print("run B");}
}//C混合了A类和B类,类似继承,C的实例化类可以使用A类以及B类中的方法
class C with A, B {}main() {C c = new C();c.printA();c.printB();c.run();
}

命令执行后效果如下:

Connecting to VM Service at ws://127.0.0.1:55350/kWXd6C3DRl4=/ws
This is A
This is B
run B

注意:如果有相同方法,则执行时主要依赖with的顺序。

同时这里也可以同时extends其他类基础上再使用mixins机制。关键代码如下所示:

class C extends  X with A, B {}

2.4 late关键字

表示延迟初始化,不在对象初始化时初始化,而是在对象初始化之后。参考2.2 implements接口中demo。

2.5 identical函数

主要用于检查两个引用是否指向同一个对象。关于identicial的判定,参考如下代码:

void main() {var o1 = new Object();var o2 = new Object();var isIdentical = identical(o1, o2); // false, diff objects.isIdentical = identical(o1, o1); // true, same objectisIdentical =identical(const Object(), const Object()); // true, const canonicalizesisIdentical = identical([10], [10]); // falseisIdentical = identical(const [10], const [10]); // trueisIdentical = identical(const [1], const [2]); // false
}

2.6 常量构造函数

在Dart语言中,const一方面是内存开销减少,另一方面源自从常量组件是不应该改变的需求。常量构造函数需要满足以下约束:

  • 常量构造函数需要以const关键字修饰;
  • const构造函数必须用于成员变量都是final的类;
  • 如果实例化不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例对象;
  • 实例化常量的构造函数的时候,多个地方创建这个对象,如果传入的值相同,只会保留一个对象;

这里给出一个demo,代码如下所示:

class Rect {final int width;final int height;const Rect({required this.width, required this.height}); 
}

3 泛型

和C++基本一致,主要解决代码中数据类型的复用问题。一般都是泛型方法和泛型类中使用。

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

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

相关文章

适配器模式来啦

网上的大多数的资料中适配器模式和代理模式都是紧挨着进行介绍的,为什么呢??? 是因为适配器模式和代理模式有太多的相似之处,可以进行联动记忆但是也要做好区分。 在菜鸟教程中,适配器模式的定义是作为两…

数学类问题(Leetcode)

1.质数数量 nullhttps://leetcode.cn/problems/count-primes/description/解题思路&#xff1a; 遍历大于1 且小于n的每个数的倍数&#xff0c;设置为非质数&#xff0c;剩下的就都是质数了。 代码&#xff1a; class Solution { public:int countPrimes(int n) {if(n<2)…

【机器学习2】什么是Jupyter notebook 新手使用Jupter notebook

什么是Jupyter notebook? Jupyter Notebook&#xff08;此前被称为 IPython notebook&#xff09;是一个交互式笔记本&#xff0c;支持运行 40 多种编程语言。 Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享程序文档&#xff0c;支持实时代码&#x…

机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战13-超导体材料的临界温度预测与分析(决策树回归,梯度提升回归,随机森林回归和Bagging回归)&#xff0c;这几天引爆网络的科技大新闻就是韩国科研团队宣称发现了室温超导材料-LK-99&#xff0c;这种材料…

Redisson 3.23.1 正式发布,官方推荐的 Redis 客户端

导读Redisson 3.23.1 现已发布&#xff0c;这是一个 Java 编写的 Redis 客户端&#xff0c;具备驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;功能&#xff0c;并获得了 Redis 的官方推荐。 此版本更新内容如下&#xff1a; Improvement 减少了 RLiveObjectSer…

决策树和随机森林对比

1.用accuracy来对比 # -*-coding:utf-8-*-""" accuracy来对比决策树和随机森林 """ from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_wine#(178, 13…

K8S系列文章之 自动化运维利器 Ansible

Ansible-安装 第一步&#xff1a;安装我们的epel扩展源 yum -y install epel-release 我这里会报/var/run/yum.pid 已被锁定&#xff0c;如果没有直接进行下一步 [rootmaster home]# yum -y install epel-release 已加载插件&#xff1a;fastestmirror, langpacks /var/run/…

C语言 用数组名作函数参数

当用数组名作函数参数时&#xff0c;如果形参数组中各元素的值发生变化&#xff0c;实参数组元素的值随之变化。 1.数组元素做实参的情况&#xff1a; 如果已经定义一个函数&#xff0c;其原型为 void swap(int x,int y);假设函数的作用是将两个形参&#xff08;x,y&#xf…

【css】组合器

组合器是解释选择器之间关系的某种机制。在简单选择器器之间&#xff0c;可以包含一个组合器&#xff0c;从而实现简单选择器难以达到的效果。 CSS 中有四种组合器&#xff1a; 后代选择器 (空格)&#xff1a;匹配属于指定元素后代的所有元素&#xff0c;示例&#xff1a;div …

GWJDN-400型2MHZ自动平衡高温介电温谱仪

GWJDN-400型2MHZ自动平衡高温介电温谱仪 关键词&#xff1a;介电常数&#xff0c;高温介电&#xff0c;自动平衡 主要功能&#xff1a; 材料介电常数测试仪 半导体材料的介电常数、导电率和C-V特性液晶材料:液晶单元的介电常数、弹性常数等C-V特性 性能特点: 温度&#xf…

【CSS】说说响应式布局

目录 一、是什么 二、怎么实现 1、媒体查询 2、百分比 3、vw/vh 4、小结 三、总结 一、是什么 响应式设计简而言之&#xff0c;就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。 响应式网站常见特点&#xff1a; 同时适配PC 平板 手机等…

chrome插件开发实例03-使用 chrome.storage API永久保存数据

目录 防止数据丢失 使用chrome.storage API 功能 功能演示 源代码 manifest.json popup.html

yxBUG记录

1、 原因&#xff1a;前端参数method方法名写错。 2、Field ‘REC_ID‘ doesn‘t have a default value 问题是id的生成问题。 项目的表不是自增。项目有封装好的方法。调用方法即可。 params.put("rec_id",getSequence("表名")) 3、sql语句有问题 检…

Docker 快速安装 MinIO

概述 MinIO 是一款基于Go语言的高性能对象存储服务&#xff0c;非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 拉取docker镜像 docker pull minio/minio创建宿主机数据目录&#xff08;共享数据卷&#xff09; 此…

Django进阶

1.模板 1.1 寻找html模板 TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates)],APP_DIRS: True,OPTIONS: {context_processors: [django.template.context_processors.debug,django.template.context_process…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明&#xff1a; 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

会这个Python的测试员,工作都不会太差!

Python语言得天独厚的优势使之在业界的火热程度有增无减&#xff0c;尤其是在经历了互联网&#xff0c;物联网&#xff0c;云计算&#xff0c;大数据&#xff0c;人工智能等浪潮的推动下&#xff0c;其关注度&#xff0c;普适度一路走高。 对于测试人员来说&#xff0c;很多人…

科技感响应式管理系统后台登录页ui设计html模板

做了一个科技感的后台管理系统登录页设计&#xff0c;并且尝试用响应式布局把前端html写了出来&#xff0c;发现并没有现象中的那么容易&#xff0c;chrome等标准浏览器都显示的挺好&#xff0c;但IE11下面却出现了很多错位&#xff0c;兼容起来还是挺费劲的&#xff0c;真心不…

编程导航算法村第九关 | 二分查找

编程导航算法村第九关 | 二分查找 LeetCode852.这个题的要求有点啰嗦&#xff0c;核心意思就是在数组中的某位位置i开始&#xff0c;从0到i是递增的&#xff0c;从i1 到数组最后是递减的&#xff0c;让你找到这个最高点。 详细要求是&#xff1a;符合下列属性的数组 arr 称为山…

Linux系统中redis基础

本节主要学习redis的概述&#xff0c;安装目录结构&#xff0c;命令解析和redis登录更改&#xff0c;数据库的操作&#xff0c;和redis的持久化。 目录 一、概述 二、安装 1.编译安装 2.rpm安装 三、目录结构 四、命令解析 五、redis登陆更改 问题 解决办法 六、数据…