【Flutter入门到进阶】Dart基础篇---面向对象

news2024/9/25 1:21:57

1 类

1.1 构造

//java中写法
class P {
  double x;
  double y;

  P(int x, int y) {
    this.x = x;
    this.y = y;
  }
}

//dart建议写法
class P {
  num x;
  num y;
  Point(this.x, this.y);
}

1.2 重定向构造

class P { 
  num x; 
  num y; 

  Point(this.x, this.y); 

  //重定向构造函数,使用冒号调用其他构造函数
  P.alongXAxis(num x) : this(x, 0);
}

1.3 命名构造函数

class Rect{
  int _height;//定义成私有成员(前面加下划线),私有成员不能被外部直接访问
  int _width;
 
  Rect(this._height,this._width);//Dart默认构造函数 只能声明一次,Java可以声明多个
  Rect.heigthSet(this._height);//命名构造函数 可以声明多个
  Rect.widthSet(this._width);//命名构造函数 可以声明多个
  Rect.allSet(this._width,this._height);//命名构造函数 可以声明多个
  Rect.allSet2():_height=5,_width=5;//带默认参数的构造方法
  
  //set get属性方法,外部通过访问属性的形式调用该方法
  set setHeight(int value){
    this._height=value;
  }
 
  //getter属性方法,不用括号,外部通过访问属性的形式调用该方法
  get getHeight{
    return _height;
  }
 
  //getter属性方法,不用括号,外部通过访问属性的形式调用该方法
  get Area{
    return _height*_width;
  }
 
  //定义私有方法
  int _area(){
    return _height*_width;
  }
 
  int getArea(){
    return _area();
  }
 
  String getMessage(){
    return('获取传入的高,宽值:$_height $_width 面积计算为:');
  }
}

1.4 类的Get和Set方法

class Rectangle {   
    num left;   
    num top;   
    num width;   
    num height;   
    Rectangle(this.left, this.top, this.width, this.height);   
    num get right => left + width; 
    set right(num value) => left = value - width;   
    num get bottom => top + height;   
    set bottom(num value) => top = value - height; 
}

2 抽象 和 继承

实例

// 定义父类
abstract class Person{
  String name;
  int age;
 
  Person(this.name, this.age);
 
  Person.second(this.name, this.age);
 
  void show() {
    print('$name $age');
  }
 
  //抽象方法定义规则,要求子类必须继承
  void marry();
}

// 子类继承,必须实现抽象方法
class Boy extends Person{
  double height;
  Boy(String name, int age,double height):super(name,age){
    this.height=height;
  }
 
  //方法重写
  @override
  void show(){
    // super.show();
    print('$name $age $height');
  }
 
  void playBoy(){
    print('男生喜欢打王者荣耀');
  }
 
  @override
  void marry() {
    print('我是一个男生,要找一个女朋友结婚');
  }
 
}

3 封装 和 多态

3.1 说明

        1、Dart中的多态体现在方法重写,向上转型

        2、比如上面Boy子类中的方法重写,我们也可以再定义一个Girl子类重写;

        3、向上转型,向下转型这里做一个简单的介绍,具体代码可在我的资源中下载去看

        4、向上转型可以提取公共方法,向下转型可以转化到子类,调用子类方法,向上转型也是一种封装

3.2 实例

        A is B 判断A是否是B类型

        A as B 把A类型转换为B类型

if(p is Boy){
    Boy boy=p as Boy;
    boy.playBoy();
}

4 接口

dart中类就是接口,和声明抽象类一样,一般是用abstract修饰

代码

abstract class Person {
  void run();
}
class Student implements Person {
  @override
  void run() {
    print("run 执行了。。。")
  }
}

5 Mixins

5.1 说明

        实际上就是多继承

                通过mixins实现类似多继承,但是mixins不属于继承,也不属于接口,就是一种新的特性

                作为mixins的类只能继承于最终父类Object,不可以继承别的类

                mixins类不能有构造函数

                一个类可以继承于多个mixins

        Mixins是Dart里面的一个全新概念,简单来说,用来复用多个类之间的代码,减少耦合,换句话来说,可以从中扩展方法(或变量)而不扩展类

5.2 示例

5.2.1 场景

        工程师 = 软件工程师 + 建筑工程师

        教师 = 美术教师 + IT教师

        工作者 = 教师 + 工程师

5.2.2 图例

5.2.3 java实现

//工作者
abstract class Worker {
    public abstract void doWork();//工作者需要工作
}

//工程师
class Engineer extends Worker {
    @Override
    public void doWork() {
        System.out.println("工程师在工作");
    }
}

//教师
class Teacher extends Worker {
    @Override
    public void doWork() {
        System.out.println("教师在教学");
    }
}

//软件工程师
class SoftwareEngineer extends Engineer {}

//建筑工程师
class BuildingEngineer extends Engineer {}

//美术教师
class ArtTeacher extends Teacher {}

//IT教师
class ITTeacher extends Teacher {}

5.3.4 Dart实现

//工作者
abstract class Worker {
  void doWork();//工作者需要工作
}

//工程师
class Engineer extends Worker {
  void doWork() {
    print('工程师在工作');
  }
}

//教师
class Teacher extends Worker {
  void doWork() {
    print('教师在教学');
  }
}

//软件工程师
class SoftwareEngineer extends Engineer {}

//建筑工程师
class BuildingEngineer extends Engineer {}

//美术教师
class ArtTeacher extends Teacher {}

//IT教师
class ITTeacher extends Teacher {}

5.4 扩展功能

5.4.1 图例

5.5 如果使用Java,那么我们自然就想到了使用interface。

5.5.1 代码示例

interface CanFixComputer {
    void fixComputer();
}

interface CanDesignSoftware {
    void designSoftware();
}

//软件工程师
class SoftwareEngineer extends Engineer implements CanFixComputer, CanDesignSoftware {

    @Override
    public void fixComputer() {
        System.out.println("修电脑");
    }
    
    @Override
    public void designSoftware() {
        System.out.println("设计软件");
    }

}

//IT教师
class ITTeacher extends Teacher implements CanFixComputer {

    @Override
    public void fixComputer() {
        System.out.println("修电脑");
    }

}

5.5.2 说明

        但是,我们知道Dart当中没有interface的概念,但并不意味着这门语言没有接口,事实上,Dart任何一个类都是接口,你可以实现任何一个类,只需要重写那个类里面的所有具体方法。

        如果要用Dart来实现的话,只需要将interface修改成abstract class。

        但是我们发现,fixComputer这个接口被继承了两次,并且两次的实现都是一样的,这里就出现了代码重复和冗余的问题。怎么办呢?在java中我们有接口的default实现来解决这个问题(这是一个java8出现的不得已的方案。)

        但是,有了mixins之后,这件事就变得不那么难了。

5.6 Dart的处理

abstract class CanFixComputer {
  void fixComputer() {
    print('修电脑');
  }
}

abstract class CanDesignSoftware {
  void designSoftware() {
    print('设计软件');
  }
}

//软件工程师
class SoftwareEngineer extends Engineer
    with CanFixComputer, CanDesignSoftware {}

//IT教师
class ITTeacher extends Teacher with CanFixComputer {}

main() {
  ITTeacher itTeacher = new ITTeacher();
  itTeacher.doWork();
  itTeacher.fixComputer();
  SoftwareEngineer softwareEngineer = new SoftwareEngineer();
  softwareEngineer.doWork();
  softwareEngineer.fixComputer();
  softwareEngineer.designSoftware();
}

通过以上代码,我们可以看到这里不用implements,更不是extends,而是with。

        每个具有某项特性的类不再需要具体去实现同样的功能,接口是没法实现功能的,而通过继承的方式虽然能实现功能,但已经有父类,同时不是一个父类,又不能多继承,所以这个时候,Dart的Mixin机制就比Java的接口会高效,开发上层的只需要关心当前需要什么特性,而开发功能模块的关心具体要实现什么功能。

5.7 无论是extends、implements还是mixin,优先级最高的是在具体类中的方法。

class First {   
    void doPrint() {     
        print('First');   
    } 
} 

class Second {   
    void doPrint() {     
        print('Second');   
    } 
} 

class Father {   
    void doPrint() {     
        print('Father');   
    } 
} 

class Son1 extends Father with First,Second { } 

class Son2 extends Father with First implements Second { 
     main() { 
        Son1 son1 = new Son1();   
        son1.doPrint(); // Second   
        Son2 son2 = new Son2();   
        son2.doPrint(); // First 
    }
}

其实在Son2中implements只是说要实现他的doPrint()方法,这个时候其实具体实现是First中Mixin的具体实现。

而Mixin的具体顺序也是可以从代码倒过来看的,最后mixin的优先级是最高的。

优先级 with>extends>implements

6 泛型

6.1 说明

        在Dart当中,有很多容器对象,在创建对象时都可以定义泛型类型,这一点和Java是一样。

        Java中的泛型信息是编译时的,泛型信息在运行时是不存在的。

        Dart的泛型类型是固化的,在运行时也有可以判断的具体类型。

6.2 示例

var list = List<String>();   
list.add('aaa');   
list.add('bbb');   
list.add('ccc');   
print(list);   
var map = Map<int, String>();   
map[1] = 'aaaa';   
map[2] = 'bbbb';  
map[3] = 'cccc';   
print(map);

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

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

相关文章

C++:红黑树

红黑树的概念 红黑树是一棵二叉搜索树&#xff0c;但是红黑树通过增加一个存储位表示结点的颜色RED或BLACK。通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出2倍&#xff0c;因而是接近平衡的。 红黑树的性质 ⭐…

「期末复习」线性代数

第一章 行列式 行列式是一个数&#xff0c;是一个结果三阶行列式的计算&#xff1a;主对角线的乘积全排列与对换逆序数为奇就为奇排列&#xff0c;逆序数为偶就为偶排列对换&#xff1a;定理一&#xff1a;一个排列的任意两个元素对换&#xff0c;排列改变奇偶性&#xff08;和…

【Unity3D】Unity 3D 连接 MySQL 数据库

1.Navicat准备 test 数据库&#xff0c;并在test数据库下创建 user 数据表&#xff0c;预先插入测试数据。 2.启动 Unity Hub 新建一个项目&#xff0c;然后在Unity编辑器的 Project视图 中&#xff0c;右击新建一个 Plugins 文件夹将连接 MySQL的驱动包 导入&#xff08;附加驱…

Java链表模拟实现+LinkedList介绍

文章目录一、模拟实现单链表成员属性成员方法0&#xff0c;构造方法1&#xff0c;addFirst——头插2&#xff0c;addLast——尾插3&#xff0c;addIndex——在任意位置插入3.1&#xff0c;checkIndex——判断index合法性3.2&#xff0c;findPrevIndex——找到index-1位置的结点…

Java围棋游戏的设计与实现

技术&#xff1a;Java等摘要&#xff1a;围棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为S…

Mac下拉式终端的安装与配置 (iTerm2)

Mac下拉式终端的安装与配置 使用效果如图所示 安装前置软件 iTerm2 很可惜&#xff0c;如此炫酷的功能在原终端中并不能实现&#xff0c;我们需要借助iTerm2这个软件来实现。 官网链接&#xff1a;iTerm2 - macOS Terminal Replacement 我们点击download下载即可 配置 当我…

代码随想录第十天(28)

文章目录28. 找出字符串中第一个匹配项的下标看答案KMPnext数组&#xff08;前缀表&#xff09;最长公共前后缀如何计算前缀表前缀表与next数组时间复杂度分析28. 找出字符串中第一个匹配项的下标 莫得思路……好久没做题&#xff0c;都已经忘得差不多了 看答案 其实就是自己…

ModelScope 垂类检测系列模型介绍

文章目录ModelScope介绍垂类模型介绍调用方式1 Demo Service2 Notebook3 本地使用* 二次开发总结ModelScope介绍 ModelScope 是阿里达摩院推出的 中文版模型即服务&#xff08;MaaS, Model as a Service&#xff09;共享平台。该平台在2022年的云栖大会上发布&#xff0c;之前…

Windows安装系列:SVN Server服务

一、下载与安装 1、下载VisualSVN-Server-5.1.1-x64.msi 地址&#xff1a;Download | VisualSVN Server 2、找到最新版本SVN 5.1.1&#xff0c;直接双击它&#xff0c;弹出如下安装界面 3、点击Next 4、勾选我接受&#xff0c; 点击"Next" 5、默认选项&#xff0c…

stack、queue和priority_queue

目录 一、栈&#xff08;stack&#xff09; 1.stack的使用 2.容器适配器 3.stack的模拟实现 二、队列&#xff08;queue&#xff09; 1.queue的使用 2.queue的模拟实现 三、双端队列&#xff08;deque&#xff09; 1.vector&#xff0c;list的优缺点 2.认识deque 四…

如何调试段错误?

刚接触指针的时候&#xff0c;经常会遇到段错误。 rootTurbo:linklist# ls link.c link.h main main.c rootTurbo:linklist# ./main 链表初始化成功 Segmentation fault (core dumped) rootTurbo:linklist#所谓段错误&#xff0c;就是访问了不能访问的内存。 比如内存不存在…

1.8 正则表达式

正则表示式是用来匹配与查找字符串的&#xff0c;从网上爬取数据不可避免的会用到正则表达式。 Python 的表达式要先引入 re 模块&#xff0c;正则表达式以 r 引导。Re库主要功能函数函数说明re.search()在一个字符串中搜索匹配正则表达式的第一个位置&#xff0c;返回match对象…

七大设计原则之里氏替换原则应用

目录1 里氏替换原则2 里氏替换原则应用1 里氏替换原则 里氏替换原则&#xff08;Liskov Substitution Principle,LSP&#xff09;是指如果对每一个类型为 T1 的对象 o1,都有类型为 T2 的对象 o2,使得以 T1 定义的所有程序 P 在所有的对象 o1 都替换成 o2 时&#xff0c;程序 P…

基于蜣螂算法改进的LSTM预测算法-附代码

基于蜣螂算法改进的LSTM预测算法 文章目录基于蜣螂算法改进的LSTM预测算法1.数据2.LSTM模型3.基于蜣螂算法优化的LSTM4.测试结果5.Matlab代码摘要&#xff1a;为了提高LSTM数据的预测准确率&#xff0c;对LSTM中的参数利用蜣螂搜索算法进行优化。1.数据 采用正弦信号仿真数据&…

算法训练——剑指offer(Hash集合问题)

摘要 数据结构中有一个用于存储重要的数据结构&#xff0c;它们就是HashMap,HasSet&#xff0c;它典型特征就是存储key:value键值对。在查询制定的key的时候查询效率最高O(1)。Hashmap&#xff0c;HasSet的底层结构是如图所示。它们的区别就是是否存在重复的元素。 二、HashMa…

搞了个ChatGPT机器人,免费使用最强大的AI,这一晚上几个群都聊high了

前言 最近ChatGPT实在是太火了&#xff01;其实去年年底的时候&#xff0c;ChatGPT已经在程序员圈子里小小的火了一把&#xff0c;再加上年后资本的炒作和各个公司疯狂的蹭热点&#xff0c;就彻底火出圈了。 ChatGPT使用体验 其实自己已经用了一段时间的ChatGPT&#xff0c;…

UART和RS232、RS485的联系和区别、以及对软件编程的影响

1、串口、UART、RS232、RS485概念的理解 (1)狭义上的串口&#xff1a;指的是串口协议&#xff0c;就是时序图、数据收发先后顺序等&#xff0c;是抽象出来的协议&#xff1b; (2)广义上的串口&#xff1a;指的是符合串口协议的接口&#xff0c;UART、RS232、RS485在实际工作中都…

Python:每日一题之剪格子(DFS剪枝)

题目描述 如下图所示&#xff0c;3 x 3 的格子中填写了一些整数。 我们沿着图中的红色线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是 60。 本题的要求就是请你编程判定&#xff1a;对给定的 mn 的格子中的整数&#xff0c;是否可以分割为两个部分&#xf…

【fastjson2.x 记录】那些从1.x升级到2.x踩过的坑

这篇文章主要记录升级到 fastjson2.x 版本后出现的一些问题 1. jar 包引入问题 问题描述&#xff1a;从 2.x 版本后&#xff0c;fastjson 貌似开始对代码模块进行了拆分&#xff0c;所以在调整配置的时候&#xff0c;会发现有些类突然没了&#xff0c;其实是需要引入其他的扩展…

ChatGPT超详细注册教程,只要3.5!

一、注册必备条件注册 ChatGPT 必备如下三个条件&#xff1a;1、用于注册ChatGPT的邮箱&#xff0c;什么邮箱都可以。2、科学上网工具&#xff0c;注册账号和登录时需要。3、一个国外手机号&#xff0c;用于接收验证码&#xff0c;后面会详细介绍如何花 3.55 元获取。二、注册 …