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

news2024/11/26 11:53:59

导言

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

抽象类(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();
}

运行结果

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

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

相关文章

前后端分离项目面试总结

一:是否登录状态 服务端登录的时候,给分配一个session用于存储数据,同时将sessionID返回给浏览器,浏览器通过cookie把sessionID存储起来,下次访问时携带上,服务端就可以通过sessionID来确定用户是否登录。 …

uview文本框组件计数count报错u--textarea

报错内容: [Vue warn]: Error in render: “TypeError: Cannot read property ‘length’ of null” found in —> at uni_modules/uview-ui/components/u-textarea/u-textarea.vue at uni_modules/uview-ui/components/u–textarea/u–textarea.vue mp.runtime.…

Flutter循序渐进==>基金管理APP首页

目录 查看版本 组件 组件源码学习 做个基金APP首页源代码 效果 查看版本 组件 组件的本质就是个类。 import package:flutter/material.dart;void main() {runApp(const OurFirstApp(),); } OurFirstApp()实例化,就是给runApp用的,runApp就是运行实…

Java的NIO体系

目录 NIO1、操作系统级别下的IO模型有哪些?2、Java语言下的IO模型有哪些?3、Java的NIO应用场景?相比于IO的优势在哪?4、Java的IO、NIO、AIO 操作文件读写5、NIO的核心类 :Buffer(缓冲区)、Channel&#xff…

用GPT-4纠错GPT-4 OpenAI推出CriticGPT模型

根据OpenAI周四(6月27日)发布的新闻稿,该公司新推出了一个基于GPT-4的模型——CriticGPT,用于捕获ChatGPT代码输出中的错误。CriticGPT的作用相当于让人们用GPT-4来查找GPT-4的错误。该模型可以对ChatGPT响应结果做出批评评论&…

Echarts地图实现:山东省报考人数

Echarts地图实现:山东省报考人数 效果预览 设计思路 数据可视化:选择地图作为数据展示的方式,可以直观地展示山东省不同城市的报考人数分布。交互性:通过ECharts的交互功能,如提示框(tooltip)…

Redis 7.x 系列【11】数据类型之位图(Bitmap)

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 基本命令2.1 SETBIT2.2 GETBIT2.3 BITCOUNT2.4 BITPOS2.5 BITFIELD2.6 BITF…

二叉搜索数的最小绝对差-二叉树

需要用到中序遍历 中序遍历 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 递归 class Solution { public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;inoder(root,res);return res;}void inoder(TreeNode* root , vector…

从零开始搭建spring boot多模块项目

一、搭建父级模块 1、打开idea,选择file–new–project 2、选择Spring Initializr,选择相关java版本,点击“Next” 3、填写父级模块信息 选择/填写group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。点击“…

计算机Java项目|基于SpringBoot的新闻稿件管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

数据结构历年考研真题对应知识点(数组和特殊矩阵)

目录 3.4数组和特殊矩阵 3.4.2数组的存储结构 【二维数组按行优先存储的下标对应关系(2021)】 3.4.3特殊矩阵的压缩存储 【对称矩阵压缩存储的下标对应关系(2018、2020)】 【上三角矩阵采用行优先存储的应用(2011)】 【三对角矩阵压缩存储的下标对应关系(2016)】 3.4.…

PyTorch Tensor进阶操作指南(二):深度学习中的关键技巧

本文主要讲tensor的裁剪、索引、降维和增维 Tensor与numpy互转、Tensor运算等&#xff0c;请看这篇文章 目录 9.1、首先看torch.squeeze()函数&#xff1a; 示例9.1&#xff1a;&#xff08;基本的使用&#xff09; 小技巧1&#xff1a;如何看维数 示例9.2&#xff1a;&a…

优化数据库字段使用位运算-php语言示例

背景&#xff1a;一个会员有三个状态&#xff0c;A、B、C&#xff0c;其中一个人可以为 A、B、C、AB&#xff1b;之前数据表结构加了三个字段is_a、is_b、is_c; 本人实在不想这样粗糙的实现需求&#xff0c;遂决定用位运算优化。 上代码&#xff1a; 位运算可以用来处理状态值…

业务代码插件式开发实践

在学习编程初期&#xff0c;会接触到设计模式的概念&#xff1a;23种设计模式&#xff0c;单例模式&#xff0c;策略模式&#xff0c;… 。接触业务研发后&#xff0c;对设计模式的使用和实践有了更深的见解。 使用设计模式是目的为了更高效的支撑业务诉求&#xff0c;如何在保…

【面试干货】Object 类中的公共方法详解

【面试干货】Object 类中的公共方法详解 1、clone() 方法2、equals(Object obj) 方法3、hashCode() 方法4、getClass() 方法5、wait() 方法6、notify() 和 notifyAll() 方法 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在 Java 中&#…

高频面试题基本总结回顾1(含笔试高频算法整理)

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

如何使用飞书快捷指令无感记账,ios版

总结 很多人无法长期坚持记账&#xff0c;主要是每次消费需要打开手机软件&#xff0c;一系列繁琐的操作&#xff0c;导致过程中可能就忘了。 今天给大家带来飞书自动记账。 演示视频 点击查看&#xff1a;https://www.douyin.com/video/7312857946382241063 安装 下载快捷…

【机器学习300问】135、决策树算法ID3的局限性在哪儿?C4.5算法做出了怎样的改进?

ID3算法是一种用于创建决策树的机器学习算法&#xff0c;该算法基于信息论中的信息增益概念来选择最优属性进行划分。信息增益是原始数据集熵与划分后数据集熵的差值&#xff0c;熵越小表示数据集的纯度越高。有关ID3算法的详细步骤和算法公式在我之前的文章中谈到&#xff0c;…

临时文件上传系统Plik

什么是 Plik &#xff1f; Plik 是一个基于 Go 语言的可扩展且用户友好的临时文件上传系统&#xff08;类似于 Wetransfer&#xff09;。 软件主要特点&#xff1a; 强大的命令行客户端易于使用的 Web 用户界面多个数据后端&#xff1a;文件、OpenStack Swift、S3、Google Clo…

单调队列优化DP——AcWing 135. 最大子序和

单调队列优化DP 定义 单调队列优化DP是一种在动态规划&#xff08;Dynamic Programming, DP&#xff09;中应用的数据结构优化方法。它利用单调队列&#xff08;Monotonic Queue&#xff09;这一数据结构来高效维护一个区间内的最值&#xff08;通常是最大值或最小值&#xf…