matlab面向对象

一、面向对象编程

1.1 面向过程与面向对象

  • 区别:
    • 面向过程的核心是一系列函数,执行过程是依次使用每个函数
    • 面向对象的核心是对象(类)及其属性、方法,每个对象根据需求执行自己的方法以解决问题
image-20230425155810396
  • 对象:单个事务的抽象。也可理解为函数数据封装

  • 面向对象的必要性:

    image-20230425155939919

1.2 对象的基本概念

  1. :一组相关的属性行为的集合,是一个抽象的概念
    • 抽象化:抽象代表现实世界中实体的行为
    • 属性:存储在类中的数据变量
    • 方法:事物可以执行的操作或行为
    • 初始化:构造一个类并指明固有属性的过程
  2. 对象:该类事物的具体表现形式,具体存在的个体

1.3 面向对象的三个特征

  • 封装
    • 一个对象就是一个封装了数据操作这些数据的代码的实体
    • 部分数据和方法只能通过内部访问,避免意外的修改
  • 继承
    • 可以复用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行拓展
    • 提供了从特殊到一般的方法
  • 多态
    • 一个类实例的相同方法在不同情形有不同表现形式
    • 不同的对象可以通过相同的操作来调用

1.4 MATLAB面向对象编程的用法

新建文件的时候直接新建一个类文件,会自动生成一个标准类模板:

image-20230822114650351
classdef untitled%UNTITLED2 此处提供此类的摘要%   此处提供详细说明propertiesProperty1endmethodsfunction obj = untitled(inputArg1, inputArg2)% 构造函数本身obj.Property1 = inputArg1 + inputArg2;endfunction outputArg = method1(obj, inputArg)% 方法outputArg = obj.Property1 + inputArg;endend
end

注意:

  • 类名称要和文件名保持一致
  • properties关键字:类属性
  • methods关键字:方法
    • 在methods里必须存在一个与类名相同的函数,这个函数的输出变量就是类产生的对象

1.5 实例

定义一只小狗;属性:名字、年龄;初始化:输入名字;方法1:让它坐下;方法2:询问年龄

classdef dogproperties% 小狗的属性nameageend methodsfunction obj = dog(name, age)% 构造函数obj.name = name;obj.age = age;endfunction sit(obj)% 让小狗坐下fprintf('%s is now sitting.\n', obj.name);endend
end
image-20230822144800834

二、面向对象的基本操作

2.1 类的属性和方法

  1. 属性

    • 属性的默认值 —— 在属性列表中指定
    • 常量属性:用Constant声明
    • 非独立属性:用Dependent声明,属性值是否取决于其他值
    • 隐藏的属性:通过Hidden声明,用于隐藏内部细节,使对象更简洁
  2. 属性的访问权限

    • 语法:(Set / Get)Access = private / protected / public
    • private:只有该类的成员方法可以访问
    • protected:只有该类的成员方法和该类的子类可以访问
    • public:除该类和子类外,在类之外的函数或脚本中也可以访问
  3. 方法

    • 构造函数Constructor
      • 构造函数和类的名称相同,用来创建类的实例
      • 一个类的定义中只能有一个构造函数
      • 构造函数只能有一个返回值,即新创建的对象

2.2 类的组合和继承

  • 继承是为了提高代码复用性,但也要注重逻辑性
image-20230426112910880
  • 实例:有一个车辆类vehicle,现在要创建一个电动车类e_vehicle

    • vehicle.m

      classdef vehicle < handle  propertiesmakeendproperties(SetAccess=protected)car_miles = 0;endproperties(Hidden)yearendproperties(Dependent)car_kmendmethodsfunction obj = vehicle(year, make)obj.make = make;obj.year = year;endfunction descripe(obj)fprintf('%s made in %d.\n', obj.make, obj.year);endfunction run(obj, miles)obj.car_miles = obj.car_miles + miles;endend
      end
      
    • e_vehicle.m

      classdef e_vehicle < vehiclepropertiessocendproperties(Constant)soc_per_mile = 1;   % 常量属性endmethodsfunction obj = e_vehicle(soc, year, make)obj = obj@vehicle(year, make); % 用@调用父类方法obj.soc = soc;endfunction run(obj, miles)run@vehicle(obj, miles);obj.soc = obj.soc - miles*obj.soc_per_mile;endend
      end
      
    • 实例化一个e_vehicle对象ev

      ev=e_vehicle(95,2020,'yiqi')
      
      image-20230822151246300
    • 假设跑了10英里(调用ev的方法run),查看ev的里程

      ev.run(10)
      ev.car_miles
      
      image-20230822151443823
    • 跑了10英里后,电量减少了,ev.soc查看从95变成了85

2.3 句柄类和实体类

  • handle类是遵循句柄语义的所有类的超类

    • 句柄是引用handle类的对象的变量
    • 多个变量可以引用同一个对象
  • handle类是抽象类,无法直接创建该类的实例。可使用handle类派生其他类,可以使其实例为句柄对象的具体类

    classdef MyHandleClass < handle		% 表示MyHandleClass类继承于handle类...
    end
    
  • 值类(实体类,Value):

    • 构造函数返回一个与其赋值变量相关联的对象
    • 复制行为会创建一个独立的副本
    • 值类对象在方法中修改后需要返回对象本身
  • 句柄类:

    • 构造函数返回一个句柄对象,该对象是对所创建对象的引用
    • 复制的句柄指向同一块内存,不会创建副本
    • 函数对作为输入参数传递的句柄对象进行修改后,不必返回该对象

例子:

值类dog_value.m

classdef dog_valueproperties% 小狗的属性nameageend methodsfunction obj = dog_value(name, age)% 构造函数obj.name = name;obj.age = age;endfunction sit(obj)% 让小狗坐下fprintf('%s is now sitting.\n', obj.name);endend
end

句柄类dog_handle.m(代码与值类一样,名称不同而已,定义时加上handle)

classdef dog_handle < handleproperties% 小狗的属性nameageend methodsfunction obj = dog_handle(name, age)% 构造函数obj.name = name;obj.age = age;endfunction sit(obj)% 让小狗坐下fprintf('%s is now sitting.\n', obj.name);endend
end
  • 分别创建两种类的实例

    image-20230822152913396
  • 复制值类dv,会创建一个独立的副本,即dv_copy与dv是相互独立的,互不影响

    image-20230822153300867
    • 将dv的age修改成10,但是dv_copy的age没改变
  • 复制句柄类dh,句柄指向同一块内存,不会创建副本,即修改其中一个的属性就会影响到另外一个

    • 修改dh的年龄,dh_copy的年龄也被修改了
    image-20230822153530554
  • 值类对象在方法中修改后需要返回对象本身

    • 在值类dog_value.m中添加一个方法set_age用于修改年龄

      • 如下图这样添加是无法修改的,因为值类对象在方法中修改后需要返回对象本身

        function set_age(obj, age)% 修改年龄obj.age = age;
        end
        
      image-20230822160127744
      • 正确的是:

        • 调用的时候如果只是执行dv.set_age这个方法,dv的age并不会被修改,因为没有返回对象本身
    • 正确的是dv = dv.set_age(2),这样才能修改dv的age

      function obj = set_age(obj, age) % 修改后需要返回对象本身% 修改年龄obj.age = age;
      end
      
    image-20230822160524761
  • 相比之下,句柄类就会更简单一些

    • 直接添加如下方法,不需要返回对象本身

      function set_age(obj, age)% 修改年龄obj.age = age;
      end
      
      image-20230822161018269
    • 调用方法set_age后,dh对象的age即被修改

  • 判断对象是否相等

    • 对于handle类
      • 可以用**==isequal**判断是否指向同一块内存(句柄复制)
      • 可以用isequal判断指向不同内存的对象是否属性一致
    • 对于value类
      • 不支持使用==判断相等关系,但可以进行运算符重载
      • 可以用isequal判断相等关系

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

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

相关文章

leetcode 118.杨辉三角

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/pascals-triangle/description/ 代码&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {// 先开空间vector<vector<int>> v;v.…

AMBA总线协议(9)——AHB(七):终章

一、前言 在之前的文章中我们讲述了AHB协议的分割传输机制&#xff0c;它使得从机可以决定一次传输是否继续进行&#xff0c;以防止 传输的执行将占据大量的时钟周期&#xff0c;有效提高了总线的公平性与效率问题&#xff0c;本文中我们将一次性学习完AHB最后的内容&#xff0…

solidity0.8.0的应用案例10:可升级合约

这个案例是代理合约的实际操作&#xff0c;代理合约实现了逻辑和数据的分离&#xff0c;就可以实现在生产环境中&#xff0c;轻松升级合约&#xff0c;这就是一个如何实际升级合约的案例。 实现一个简单的可升级合约&#xff0c;它包含3个合约&#xff1a;代理合约&#xff0c;…

FPGA原理与结构——FIFO IP核原理学习

一、FIFO概述 1、FIFO的定义 FIFO是英文First-In-First-Out的缩写&#xff0c;是一种先入先出的数据缓冲器&#xff0c;与一般的存储器的区别在于没有地址线&#xff0c; 使用起来简单&#xff0c;缺点是只能顺序读写数据&#xff0c;其数据地址由内部读写指针自动加1完成&…

【Maven教程】(三)基础使用篇:入门使用指南——POM编写、业务代码、测试代码、打包与运行、使用Archetype生成项目骨架~

Maven基础使用篇 1️⃣ 编写 POM2️⃣ 编写业务代码3️⃣ 编写测试代码4️⃣ 打包和运行5️⃣ 使用 Archetype生成项目骨架 1️⃣ 编写 POM 到目前为止&#xff0c;已经大概了解并安装好了Maven环境, 现在&#xff0c;我们开始创建一个最简单的 Hello World 项目。如果你是初次…

笔记:transformer系列

1、和其他网络的比较 自注意力机制适合处理长文本&#xff0c;并行度好&#xff0c;在GPU上&#xff0c;CNN和Self-attention性能差不多&#xff0c;在TPU&#xff08;Tensor Processing Uni&#xff09;效果更好。 总结&#xff1a; 自注意力池化层将当做key,value,query来…

通过Putty对Linux服务器进行文件的上传与下载

1、下载安装Putty&#xff0c;下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 2、打开cmd窗口&#xff0c;通过命令行进入安装路径&#xff0c;如&#xff1a; 3、上传文件 pscp 文件 用户名服务器ip:目录使用“ -l ”选项可以指定用户…

SpringDataRedis 使用

1. SpringDataRedis 特点2. 使用 SpringDataRedis 步骤3. 自定义 RedisTemplate 序列化4. SpringDataRedis 操作对象 1. SpringDataRedis 特点 提供了对不同 Redis 客户端的整合&#xff08;Lettuce 和 Jedis&#xff09;提供了 RedisTemplate 统一 API 来操作 Redis支持 Redi…

tcl学习之路(五)(Vivado时序约束)

1.主时钟约束 主时钟通常是FPGA器件外部的板机时钟或FPGA的高速收发器输出数据的同步恢复时钟信号等。下面这句语法大家一定不会陌生。该语句用于对主时钟的名称、周期、占空比以及对应物理引脚进行约束。 create_clock -name <clock_name> -periood <period> -wa…

简单认识Docker数据管理

文章目录 为何需要docker数据管理数据管理类型 一、数据卷二、数据卷容器三、容器互联 为何需要docker数据管理 因为数据写入后如果停止了容器&#xff0c;再开启数据就会消失&#xff0c;使用数据管理的数据卷挂载&#xff0c;实现了数据的持久化&#xff0c;重启数据还会存在…

Python爬取斗罗大陆全集

打开网址http://www.luoxu.cc/dmplay/C888H-1-265.html F12打开Fetch/XHR&#xff0c;看到m3u8&#xff0c;ts&#xff0c;一眼顶真&#xff0c;打开index.m3u8 由第一个包含第二个index.m3u8的地址&#xff0c;ctrlf在源代码中一查index&#xff0c;果然有&#xff0c;不过/…

基于GRU门控循环网络的时间序列预测matlab仿真,对比LSTM网络

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 LSTM: GRU 2.算法运行软件版本 matlab2022a 3.部分核心程序 %构建GRU网络模型 layers [ ...sequenceInputLayer(N_feature)gruLayer(N_hidden)f…