Flutter循序渐进==>封装、继承、多态、抽象类以及属性修改

导言

新学一门编程语言,最难以理解的莫过于类了。如果类没用,也就算了,它偏偏很有用,我们必须得掌握,不然怎么好意思说自己会面向对象编程呢?

抽象类(Abstract Class)在面向对象编程中扮演着非常重要的角色,主要用于定义一个或多个抽象方法的模板,供子类继承并实现这些抽象方法。抽象类不能被实例化,它的主要用途包括:

  1. 定义接口规范:抽象类可以包含抽象方法(没有具体实现的方法),这些方法只有声明没有具体的实现。子类继承抽象类时必须实现这些抽象方法,这样就强制要求子类遵循一定的规范,实现了功能的统一和接口的一致性。

  2. 提供默认实现:虽然抽象类的主要目的是定义接口,但它也可以提供一些具体实现的方法。这样,子类可以继承这些方法而无需重新实现,既提供了灵活性也保证了代码的重用。

  3. 设计模式与架构:在软件设计模式和架构中,抽象类经常用于定义框架或基础结构,而具体的实现细节留给子类完成。这有助于分离关注点,提高代码的模块化和可维护性。

  4. 提升代码的可扩展性:通过定义抽象类和抽象方法,可以轻松地增加新的子类来扩展功能,而无需修改现有的抽象类或其它已有的子类,符合开闭原则(Open-Closed Principle)。

把类搞的低小下,让从没编过程的都能听懂

封装

封装挺好,不用知道里面的复杂,直接拿起来就用。大自然就是很会封装的,每个人都封装得很好。在这里封装主要是把数据封装到一个类里面。如果是私有,就在前面_,这是Dart的搞法。

继承

子类继承了父类所有的特征,父传子,甲天下!

多态

子类可以青出于蓝胜于蓝,搞自己的,表现就是@override,覆盖父类的方法!

class General {
  //name和company可以叫字段、变量或者属性,都是一回事,不知道谁搞那么复杂?
  String _name = '';
  String _company = '';

  //构造函数,用来初始化变量,这是类General的构造函数,用于初始化新创建的General对象的属性。
  // 构造函数的参数与类的属性名称相同,因此使用了Dart的快捷语法(被称为“命名参数构造”)。
  // 当你创建类的实例时,传递给构造函数的参数值会自动赋给相应的属性。
  //老粗说法:就是调用类(实例化)的参数,给这个构造函数,构造函数传递给类的属性,是类和外界通信的桥梁.

  //试图限制General类的name属性不能被设置为"吕布",但是实际上在创建General类实例时,直接传递
  // 了'吕布'作为name参数,这一步绕过了setter方法的检查。这是因为构造函数直接访问了 _name 字
  // 段,而不是通过setter方法设置。所以,尽管在setter方法中设置了限制条件,但在构造函数中
  // 直接赋值时并没有执行这个限制检查。

  // 在构造函数中使用setter方法来确保name的值不被设置为"吕布"
  General(String name, String company) {
    this.name = name; // 这里间接调用了setter方法,进行值的设置及检查
    this._company = company;
  }

  // Getter for name 把_name的值用getter薅过来
  String get name => _name;

  // Setter for name with validation,开始修改,根据传进来的参数来搞事。
  set name(String value) {
    if (value != '吕布') {
      _name = value;
    } else{
      _name = '三姓家奴';
    }
    // 注意:如果传入的是"吕布",这里不做任何操作,相当于拒绝了该设置。
  }

  String get company => _company;
  // 注意:没有提到对_company的设置逻辑,所以我保留了直接的getter,没有setter。

  //方法就是类里面的函数,用来搞动作
  void selfIntro(){
    print('大家好,我是$_name,我来自$_company!');
  }
}

//搞个小类,前面已经有将军了,就没必要重新搞了,搞个刘备的将军,继承将军类
//定义了一个名为liubeiGeneral的新类,它通过extends General继承自General类。
// 这意味着liubeiGeneral类将拥有General类的所有属性和方法,并可以在此基础上扩展或修改。
class liubeiGeneral extends General{
  //liubeiGeneral类的构造函数通过使用super关键字调用父类General的构造函数。
  // 这里super.name和super.company分别指代父类构造函数中对应的参数,
  // 这样可以确保子类实例化时也能初始化父类的属性。这是一种简化的构造函数声明方式
  // ,用于直接委托给超类构造函数处理参数。
  liubeiGeneral(super.name, super.company);
//在子类liubeiGeneral中,新增了一个名为han的方法,用于打印一条关于效忠汉室的信息。
// 这个方法是liubeiGeneral类特有的,不在其父类General中。
  void han() {
    print('我们都是为汉室效忠!');
  }
  //我不喜欢老的开场白,自己写一个覆盖原来的
  @override
  void selfIntro(){
    print('我是$_name,我为$_company代言!');
  }
}

//抽象类
abstract class HanGeneral {
  void fight();
}
//把抽象类写详细,抽象类是老领导,搞战略,子类是马仔,去跑腿执行
class ShuGeneral extends HanGeneral {
  @override
  void fight(){
    print('我们誓死捍卫汉室!');
  }
}

void main(){
  //类打个括号就是实例化,并把参数传递给构造函数,name为'赵云',company为'刘备集团'。
  General ZhaoYun = General('吕布', '刘备集团');
  //调用Zhaoyun实例(就是具体的赵云人)的selfIntro方法,就打印出
  //大家好,我是赵云,我来自刘备集团!
  ZhaoYun.selfIntro();

  liubeiGeneral Guanyu = liubeiGeneral('吕布', '刘备集团');
  Guanyu.selfIntro();
  Guanyu.han();
  ShuGeneral().fight();
}

代码

class General {
  //name和company可以叫字段、变量或者属性,都是一回事,不知道谁搞那么复杂?
  String _name = '';
  String _company = '';

  //构造函数,用来初始化变量,这是类General的构造函数,用于初始化新创建的General对象的属性。
  // 构造函数的参数与类的属性名称相同,因此使用了Dart的快捷语法(被称为“命名参数构造”)。
  // 当你创建类的实例时,传递给构造函数的参数值会自动赋给相应的属性。
  //老粗说法:就是调用类(实例化)的参数,给这个构造函数,构造函数传递给类的属性,是类和外界通信
  //的桥梁.

  //试图限制General类的name属性不能被设置为"吕布",但是实际上在创建General类实例时,直接传递
  // 了'吕布'作为name参数,这一步绕过了setter方法的检查。这是因为构造函数直接访问了 _name 字
  // 段,而不是通过setter方法设置。所以,尽管在setter方法中设置了限制条件,但在构造函数中
  // 直接赋值时并没有执行这个限制检查。


  // 在构造函数中使用setter方法来确保name的值不被设置为"吕布"
  General(String name, String company) {
    this._name = name; // 这里间接调用了setter方法,进行值的设置及检查
    this._company = company;
  }

  // Getter for name 把_name的值用getter薅过来
  String get name => _name;

  // Setter for name with validation,开始修改,根据传进来的参数来搞事。
  set name(String value) {
    if (value != '吕布') {
      _name = value;
    } else{
      _name = '三姓家奴';
    }
    // 注意:如果传入的是"吕布",这里不做任何操作,相当于拒绝了该设置。
  }

  String get company => _company;
  // 注意:没有提到对_company的设置逻辑,所以我保留了直接的getter,没有setter。

  //方法就是类里面的函数,用来搞动作
  void selfIntro(){
    print('大家好,我是$_name,我来自$_company!');
  }
}

//搞个小类,前面已经有将军了,就没必要重新搞了,搞个刘备的将军,继承将军类
//定义了一个名为liubeiGeneral的新类,它通过extends General继承自General类。
// 这意味着liubeiGeneral类将拥有General类的所有属性和方法,并可以在此基础上扩展或修改。
class liubeiGeneral extends General{
  //liubeiGeneral类的构造函数通过使用super关键字调用父类General的构造函数。
  // 这里super.name和super.company分别指代父类构造函数中对应的参数,
  // 这样可以确保子类实例化时也能初始化父类的属性。这是一种简化的构造函数声明方式
  // ,用于直接委托给超类构造函数处理参数。
  liubeiGeneral(super.name, super.company);
//在子类liubeiGeneral中,新增了一个名为han的方法,用于打印一条关于效忠汉室的信息。
// 这个方法是liubeiGeneral类特有的,不在其父类General中。
  void han() {
    print('我们都是为汉室效忠!');
  }
  //我不喜欢老的开场白,自己写一个覆盖原来的
  @override
  void selfIntro(){
    print('我是$_name,我为$_company代言!');
  }
}

//抽象类
abstract class HanGeneral {
  void fight();
}

class ShuGeneral extends HanGeneral {
  @override
  void fight(){
    print('我们誓死捍卫汉室!');
  }
}

void main(){
  //类打个括号就是实例化,并把参数传递给构造函数,name为'赵云',company为'刘备集团'。
  General ZhaoYun = General('吕布', '刘备集团');
  //调用Zhaoyun实例(就是具体的赵云人)的selfIntro方法,就打印出
  //大家好,我是赵云,我来自刘备集团!
  ZhaoYun.selfIntro();

  liubeiGeneral Guanyu = liubeiGeneral('吕布', '刘备集团');
  Guanyu.selfIntro();
  Guanyu.han();
  ShuGeneral().fight();
}

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何看待AIGC中漫画版权争议?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声,互动答疑环节往往反映了高校师生当前最普遍的运营困境,特此计老师在现场即兴答疑之外,会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

java 操作 milvus 2.1.4

1. 确认 docker 运行的 milvus容器镜像版本情况&#xff1a; 2. pom 依赖&#xff1a; <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.1.0</version><exclusions><exclusi…

【秋招突围】2024届秋招笔试-科大笔试题-01-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 &#x1f4d6…

在Tomcat中部署war包

1、准备war包 确保已经有一个有效的war包&#xff0c;该war包包含了web应用程序的所有内容&#xff1b; 2、停止tomcat服务器 在部署之前&#xff0c;确保tomcat服务器已经停止&#xff0c;进入tomcat的配置目录执行命令&#xff1a;[路径]/tomcat/conf&#xff1b; 在Linux…

前端vite+vue3——利用环境变量和路由区分h5、pc模块打包(从0到1)

⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端vitevue3——利用环境变量和路由对前端区分h5和pc模块打包&#xff08;从0到1&#xff09;。 背景&#xff1a; 前端本地开发pc和h5的项目&#xff0c;发布时需要区分开h5和pc的页面 vite Vite 通过在一开始将应…

论文阅读--《FourierGNN:从纯图的角度重新思考多元时间序列预测》

Yi K, Zhang Q, Fan W, et al. FourierGNN: Rethinking multivariate time series forecasting from a pure graph perspective[J]. Advances in Neural Information Processing Systems, 2024, 36. 本次介绍的文章来自NeurIPS 2023&#xff0c;关于多变量时间序列的预测 摘要…

CocosCreator构建IOS的wwise教程

CocosCreator构建IOS教程 添加wwise教程: 1.添加include 2.添加SoundEngine 3.添加Profile-iphoneos下面lib下面的.a 4.导入js调用C++的文件 5.导入这些文件 6.初始化ios绝对路径和TTS语音合成对象 6.获得根目录绝对路径,加载pck需要找到绝对路径。怎么找绝对路径? #impor…

现如今软考通过率真的很低吗?

刚开始机考&#xff0c;10个人中有3个人表示想要尝试考试&#xff0c;这样通过率能高吗&#xff1f;就拿PMP证书来说吧&#xff0c;一下子就得花费三千多块&#xff0c;有几个人会轻易去尝试呢&#xff1f; 说到底&#xff0c;考试的难度是一个方面&#xff0c;考试的成本低是…

vue3日历选择器

倒叙日历&#xff1a; <template><div class"date-picker"><div class"column" wheel"onYearScroll"><div v-for"(year, index) in displayedYears" :key"index" :class"{current: year current…

深度解析RocketMq源码-消费者索引ConsumeQueue

1.绪论 rocketmq的broker中关于消息持久化的组件主要包含三个&#xff0c;分别是&#xff1a;持久化消息到文件中的组件commitLog&#xff1b;根据消息key索引commitLog日志的indexFile&#xff1b;消费者根据topic和queueId查询commitLog日志的consumeQueue。前面已经介绍com…

Profibus协议转profinet协议网关模块连接电机保护器与PLC通讯

一、背景 工业通讯中常见的协议有&#xff1a;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profinet协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议等在现代工业控制系统中具有重要的角色。而Profibus协议转…

智慧数据中心可视化:高效管理与直观监控的未来

随着数据中心的规模和复杂性不断增加&#xff0c;传统管理方式难以满足需求。智慧数据中心通过图扑可视化实现实时数据监控和智能分析&#xff0c;将复杂的基础设施直观呈现&#xff0c;极大提升了运维效率、故障排查速度和资源优化能力&#xff0c;为企业提供现代化、智能化的…

mac app应用程序如何自定义图标, 更换.app为自己喜欢的图标或者图片 详细图文讲解

在mac系统中&#xff0c;我们可以对任何的app应用程序更换或者自定义图标&#xff0c; 这个图标可以是拥有的app的图标&#xff0c;或者是你自己制作的 x.icns 图标 或者是 任意的图片&#xff0c; 建议大小512x512 。 自定义图标方法如下&#xff1a; 1. 更换为已有app的图标…

词向量模型

文章目录 RNN词向量模型模型整体框架训练数据构建CBOW与Skip-gram模型负采样 RNN 卷积神经网络&#xff08;CNN&#xff09;主要应用计算机视觉&#xff0c;而递归神经网络&#xff08;RNN&#xff09;主要应用于自然语言处理。 递归神经网络会涉及处理之前所有的数据&#x…

Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好

macOS系统虽然以稳定、安全系数高等优点著称&#xff0c;但因其封闭性&#xff0c;不能对NTFS格式磁盘写入数据常被人们诟病。优质的解决方案是使用磁盘管理软件Paragon NTFS for Mac&#xff08;点击获取激活码&#xff09;和Tuxera NTFS&#xff08;点击获取激活码&#xff0…

51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;蜂鸣器 2.1 介绍 2.2 板子位置电路图 2.3 发声原理 2.4 音符和频率 三&#xff0c;创建Keil项目 四&#xff0c;代码 4.1 乐谱代码 4.1.1 《义勇军进行曲》 4.1.2 《天空之城》 4.1.3 《小美满》 4.1.…

2024年湖南建筑安全员考试题库,精准题库。

31.安全考核的对象应包括施工企业各管理层的&#xff08;&#xff09;、相关职能部门及岗位和工程项目参建人员。 A.技术负责人 B.安全负责人 C.主要负责人 D.第一负责人 答案&#xff1a;C 32.安全防护设施应标准化、定型化、&#xff08;&#xff09;。 A.规范化 B.工…

TFMath Caculator:一个简单的Java AWT计算器

目录 背景&#xff1a; 代码展示: 代码解析: 输出结果: 总结: 背景&#xff1a; 使用Java AWT(Abstract Window Toolkit)库创建的简单计算器应用-TFMath Calculator。这个计算器允许用户输入两个数字&#xff0c;点击号按钮后&#xff0c;计算器会计算这两个数字的和&…

【Redis四】主从复制、哨兵以及Cluster集群

目录 一.主从复制、哨兵、集群的区别 二.Redis主从复制 1.作用 2.原理 3.流程 三.搭建Redis 主从复制 1.源码编译安装以及配置文件修改 1.1.修改 Redis 配置文件&#xff08;Slave节点操作&#xff09; 2.验证主从复制 2.1.在Master节点上看日志 2.2.在Master节点上…

混凝土搅拌站中的智能化系统应用

随着科技的飞速发展&#xff0c;混凝土搅拌站已经进入了现代化、智能化的新时代。现代自动化、智能化技术的应用&#xff0c;使得混凝土搅拌站更加高效、准确、可靠&#xff0c;同时也提高了生产效率和质量。本文将带你深入探索混凝土搅拌站中运用到现代自动化、智能化的方方面…