文章目录

  • MATLAB面向对象
    • 面向对象编程的优点
    • MATLAB中的类
      • 类的属性
      • 类的方法
      • 类的继承
      • 类的聚集
      • Handle类的set和get方法
      • 类的访问权限
    • MATLAB的Vaule类和Handle类
  • AppDesigner
    • 各个版本的特点
    • mlapp文件基本格式
    • MVC模式设计GUI
    • MVC简单使用
  • 设计模式
    • 博文链接

MATLAB面向对象


20200322

面向对象编程的优点

  • 把大问题分解成小对象
  • 通过组合和信息传递完成任务
  • 通过继承达到代码的复用
  • 修改或者添加模块不会影响到其他模块

1、为了解决一个大问题,需要将大问题分解成多个小问题。对于面向过程而言,其对应的小问题是函数,数据在函数间交互
对于面向对象而言,其对应的小问题是模块,模块不但拥有数据还拥有方法,模块和模块之间通过组合和交互来解决问题
2、面向对象通过各个对象之间的组合和信息的传递完成任务,对象之间不仅可以相互交流,而且可以组合成新的对象
3、面向对象的编程方式对修改封闭,对扩展开放

MATLAB中的类

MATLAB中的任何变量都属于一个类,

MATLAB中在新建类的时候,提供了最基本的模板,

classdef Point2D < handle%----------------------------------------------------------------------% 类的属性%----------------------------------------------------------------------propertiesxyendproperties(Dependent)            % 非独立属性,其值依赖于其他属性的值rendproperties(Constant,Hidden)      % 同时设置属性为 常量属性、隐藏属性verInfo = '1.00版本,测试使用';end%----------------------------------------------------------------------% 类的方法%----------------------------------------------------------------------methods%-- 构造函数function obj = Point2D(x0,y0)if nargin == 0 obj.x = 10;obj.y = 20;elseif nargin == 2obj.x = x0;obj.y = y0;endend%-- 计算 非独立属性 的值function r = get.r(obj) r = sqrt(obj.x^2+obj.y^2);disp('get.r被调用\n');end%-- set方法,设置属性的值function set.x(obj,val)obj.x = val;disp('set.x被调用\n'); end%         %-- 对坐标点进行归一化
%         function normalize(obj)
%             obj.x = obj.x/obj.r;
%             obj.y = obj.y/obj.r;
%         end%-- 输出属性function print(obj)disp(['x=',num2str(obj.x)]);disp(['y=',num2str(obj.y)]);endend
endclassdef Point3D < Point2D % 用<表示继承propertieszendmethodsfunction obj = Point3D(x0,y0,z0)obj = obj@Point2D(x0,y0);obj.z = z0;endfunction print(obj)print@Point2D(obj);disp(['z=',num2str(obj.z)]);endend
end

类的属性

  • 属性对类型没有限制,可以是标量,可以是矩阵,可以是GUI对象,等等
  • 属性可以有默认值,默认值可以直接赋予一个值,也可以是一个MATLAB表达式仅在加载类的时候计算一次
  • 常量属性在对象生存周期中保持不变,不能对其进行修改(通常用来修饰工程计算中规定的常量、硬件指标
  • 非独立属性的值依赖于其他属性,一旦其他属性的值改变,则该属性也会改变;支持点调用和向量化操作
  • 隐藏属性是指在命令行中查看对象的信息时,该属性不会显示出来

类的方法

  • 可以在类定义中仅给出函数的声明,将函数的实现放到一个单独的文件中(构造函数、析构函数、static函数不能如此做
  • 如果想使用点调用的方式,则obj必须作为成员方法的参数之一
  • 方法的签名是由调用对象所属的类的名字和方法的名称共同构成的。
  • 构造函数与类名相同,它负责创建类的对象,通常也用作初始化对象的属性。一个类的定义中只能有一个构造函数。

类的继承

  • 使用<表示继承
  • 可以通过isa函数来查询一个对象是否属于一个特点的类
  • 子类先继承了父类的属性和方法,然后才在父类的基础上增加了自己的属性和方法
  • 在子类方法中调用父类方法时,@符号前面是父类方法的名称,后面是父类的类名

类的聚集

参考博文链接
类的组合
类的聚集

从以上文章可知,可以从如下几点来考虑聚集和继承的异同,
相同点
都允许在自己的类中加入其它类的对象去访问相应的对象、操作相关的方法。
不同点

  • 理解is-a和has-a。is-a表示“是一个”的意思,可以理解成为一种“属于”关系(可以通过继承来实现)has-a表示“有一个”的意思,可以把它理解为一个“包含”关系(可以通过聚集来实现)
  • 继承当中子类和父类之间的耦合性是比较高的。相对于继承来说,聚集中没有继承中那种层与层之间的严格层次结构,与继承相比使用更灵活一些

Handle类的set和get方法

  • set方法为对象属性的赋值提供了一个中间层。通常用来检测赋值是否符合要求;或者在设置属性值得时候,附带做一些其他的工作
  • get方法为查询成员属性提供了一个中间层。最常用的是,当某个属性设为Dependent时,使用get方法;或者在处理大程序时,为了维持多个版本之间的兼容性,使用get方法
  • 使用set和get方法是有时间成本的。在MATLAB中,调用成员方法的时间要大于直接访问属性的时间,并且set和get方法不会被MATLAB即时编译加速

类的访问权限

Access赋值SetAccess查询GetAccess

私有属性,只有该类的成员方法可以访问该数据,而子类和其他外部函数无法访问;
保护属性,只有该类的成员方法和子类可以访问该数据;
公开属性该类的成员方法、子类的成员方法、类之外的函数都可以访问该数据

另外,MATLAB还提供了机制来实现仅仅把私有数据的访问和修改权限提供给个别类的功能。

MATLAB的Vaule类和Handle类

参见博文链接
MATLAB句柄类和实体类
MATLAB 面向对象编程(五)Value类和Handle类
Handle类和Value类的区别

函数的参数传递
普通函数的参数传递都是值传递,即函数内对参数的任何修改都不会影响函数外原有的值;无法通过函数引用传参对传入数据进行处理,如果非要得到处理后的参数,必须将其设置为返回值;如果大量数据进行这种处理,就会导致运算速度很慢。

Vaule类和Handle类

  • Value 类是数值类,数值类不能在非构造函数中修改类的属性,如果要修改属性必须返回一个新的类,原来类依旧不变
  • Handle 类在定义类时继承 handle 即可,Handle 类可以在非构造函数中修改属性

  • Value 类复制(nValue = mValue)会复制新的数据给 nValue ,两个类拥有两份独立数据
  • Handle 类复制(nHandle = mHandle)只是复制指针,相当于引用,即 nHandle 和 mHandle 指向相同的数据,相当于引用

  • Value类比较简单,Value类对象的行为和普通的MATLAB变量,还有普通的struct行为基本一致,当我们希望定义数据结构的时候,可以使用Value类。如果我们希望每次对对象的拷贝,得到的都是一个独立的对象,可以使用Value类
  • Handle类对象提供的是对实际数据的一个访问渠道,从实用计算的角度来说,如果我们的数据体积比较大,我们希望这些数据在各个方法,函数之间的传递迅捷,不需要被局部拷贝的话,可以用Handle类来包装数据
  • 从物理的角度,如果类的对象对应的是一个独一无二的物理对象,比如一个串口,比如一个打印机,比如对一个文件的访问接口,那么应该把它设计成Handle类,因为对这些对象的拷贝仅仅拷贝的是一个访问它们的渠道。如果把它们设计成Value类,当我们做拷贝时,将面临这样一个难题,很难从语义上解释一个独一无二的实体在程序中有两个全同的拷贝。

AppDesigner


20200328

各个版本的特点

  • 在2017b版本中,引入了menu控件
  • 在2018a版本中,加入了mlapp向前兼容功能,可以将mlapp另存为2016、2017等版本
  • 2019b版本的Axies支持3D画图功能

mlapp文件基本格式

将mlapp文件作为zip文件打开,可以看到文件结构如下

文件 描述
_rels/.rels 似乎和APP无关
[Content_Types].xml 似乎和APP无关
metadata/coreProperties.xml 包含APP的创建、更新时间信息
metadata/mwcoreProperties.xml 包含APP对应的Matlab版本信息
metadata/mwcorePropertiesExtension.xml 包含Matlab的信息
appdesigner/appModel.mat 包含APP的部分代码信息
matlab/document.xml 包含了APP的全部代码信息

对于2017版本,appData.CodeData.EditableSection.Code包含的是APP中可编辑的代码内容
对于2019版本,APP的信息包含在code、components变量中

MVC模式设计GUI

模型(Model):负责程序的内在逻辑;
视图(View):负责构造,展⽰⽤户界⾯,可直接使用app designer设计;
控制器(Controller):负责处理⽤户输⼊

参照《MATLAB面向对象编程》一书提供的范例,使用app designer模拟设计,也是折腾了一阵子,才使得MATLAB的命令窗口中没有出现warnings。大致有以下几点要注意,

  • 如果直接在app designer的按钮中设置回调函数,则生成的回调函数模板为xxxx(app, event),不是xxxx(app,src,event)的格式,导致运行过程中会出现警告
  • 如果回调函数在Controller类中,注册侦听函数时,直接使用形如@app.controlObj.callback_Button_WithDrawPushed的方式是行不通的,没有真正将该函数设置为回调函数
  • 可以为APP设置输入参数

MVC简单使用

部分代码如下图

使用虚拟串口软件,将app与串口调试助手相连接,测试情况如下图,

需要注意的是其中,uitable空间可以更改每行的背景色,但是无法单独设置每行的字体颜色(2019b版本不支持html设置字体的方法)。由此想到,虽然使用appdesigner设计GUI时,可以利用matlab提供的丰富的函数,但它提供的控件在易用上还是不如VS提供的

设计模式

博文链接

Matlab函数装饰器(Functional Decorator)
Matlab组合模式(Composite)
Matlab代理模式(Proxy)
Matlab中介者模式(Mediator)
Matlab享元模式(Flyweight)
Matlab命令模式(Command)
Matlab桥接模式(Bridge)
Matlab混入模式(Mixin)
Matlab空对象模式(Null Object)
Matlab解释器模式(Interperter)
Matlab备忘录模式(Memento)
Matlab建造者模式(Builder)
Matlab迭代器模式(Iterator)
Matlab适配器模式(Adapter)
Matlab状态模式(State)
Matlab工厂模式(Factory)
Matlab单例模式(Singleton)
Matlab模板模式(Template)
Matlab装饰模式(Decorator Pattern)
Matlab责任链模式(Chain)
Matlab外观模式(Facade)
Matlab原型模式(Prototype)
Matlab观察者模式(Observer)
Matlab策略模式(Strategy)
Matlab访问者模式(Visitor)

MATLAB面向对象_及_AppDesigner使用相关推荐

  1. matlab面向对象排序,matlab面向对象编程基础

    matlab面向对象编程基础 觉得有用的话,欢迎一起讨论相互学习~ Matlab面向对象大体结构 类定义的普通模板 代码清单2.1.1 classdef className properties pr ...

  2. python类方法和实例方法syntax errors_《Fluent Python》CH.11_面向对象_接口:从协议到抽象基类...

    主要内容 首先,本章说明抽象基类的常见用途:实现接口时作为超类使用 说明抽象基类如何检查具体子类是否符合接口定义,以及如何使 用注册机制声明一个类实现了某个接口,而不进行子类化操作 最后, 说明如何让 ...

  3. matlab面向对象多态性,MATLAB面向对象程序设计10版.pptx

    MATLAB面向对象程序设计10版.pptx MATLAB面向对象程序设计;第1章 绪言;1.1如何学会一门编程语言;1.2做笔记的方法;第2章 MATLAB基础知识;MATLAB的help文档;Ma ...

  4. matlab怎样做单值spc,统计过程控制_spc_及MATLAB实现_宋景涛.pdf

    统计过程控制_spc_及MATLAB实现_宋景涛 理 论 与 实 践 质 量 工 程 卷 Quality Engineering T h e o r y 统计过程控制(spc)及MATLAB实现 &a ...

  5. 《MATLAB面向对象程序设计》

    <MATLAB面向对象程序设计> 基本信息 作者: 苗志宏    马金强 出版社:电子工业出版社 ISBN:9787121233449 上架时间:2014-6-18 出版日期:2014 年 ...

  6. MATLAB面向对象编程简介

    Object-oriented programming(面向对象编程)应用于软件开发过程中,它是建立在对事物科 学分类和描述基础上的编程方法.采用面向对象方法可以使系统各部分各司其职.各尽所能.为编程 ...

  7. MATLAB图像处理_同态滤波1

    原 MATLAB图像处理_同态滤波 2015年01月20日 09:54:25 风雨也无晴 阅读数:14234 <span class="tags-box artic-tag-box&q ...

  8. java模拟加速匀速减速_【JavaSE练习】面向对象_练习_模拟汽车的自动驾驶系统

    [JavaSE练习]面向对象_练习_模拟汽车的自动驾驶系统 [JavaSE练习]面向对象_练习_模拟汽车的自动驾驶系统 模拟汽车驾驶系统 定义一个交通工具的类,包括: 属性:速度 方法:设置速度,加速 ...

  9. 基于粒子群PSO算法的风光发电与电动汽车充放电协同优化调度matlab程序_电动汽车v2g

    V2G模型 基于粒子群PSO算法的风光发电与电动汽车充放电协同优化调度matlab程序_电动汽车v2g 1.针对大规模电动汽车无序接入电网给电力系统带来的负荷压力问题,提出一种含不确定性电源的电动汽车 ...

最新文章

  1. yunfile php,【转载】Typecho又拍云文件管理插件UpyunFile升级
  2. Python中的 __name__属性的含义和作用
  3. [云炬创业基础笔记]第二章创业者测试16
  4. eclipse搭建Android开发环境
  5. 产品运行所需的信息检索失败_为服务业注入新活力,华北工控推出服务机器人专用计算机产品方案...
  6. 20159206 《网络攻防实践》第九周学习总结
  7. python企业级框架_Python六大开源框架对比:Web2py略胜一筹(转)
  8. 如何防止sql注入?防止sql注入方法介绍
  9. 如何提高自身数学分析水平
  10. 爬取《战狼2》电影短评论,生成图云
  11. 大数据文字游戏_什么是大数据?
  12. 工业互联网的数据集成
  13. 如果一个数等于它的因子之和,则称该数为“完数”(或“完全数”)。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程找出1000之内的所有完数。
  14. JavaScript中let的用法
  15. 计算机辅助制造工程师什么,cam工程师是什么意思
  16. 软件压缩卡与硬件压缩卡的比较
  17. java uri 是什么_java的URI和URL到底是什么
  18. 中长期定存利率下行 大额存单还“香”吗
  19. 2014年计算机专业考研大纲,2014计算机考研大纲全面解析
  20. mysql.server 脚本解析

热门文章

  1. 实验matlab滤波器心得,数字滤波器实验总结
  2. 【前端面试】首屏优化
  3. magento 货币换算
  4. Zynq LTE基站设计与实现
  5. mysql双主架构沈剑_58 沈剑 - 数据库架构师做什么-58同城数据库架构设计思路
  6. 总成绩冒泡排序Java_输入班级48分的java考试成绩,并且将其顺序排序
  7. Python新手-记一次股权穿透层级打分(森林实现)
  8. yum报Exiting on user cancel
  9. 2022.1.25复盘
  10. 23种设计模式-依赖倒转原则