MATLAB面向对象_及_AppDesigner使用

文章目录

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

MATLAB面向对象


20200322

面向对象编程的优点

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

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

MATLAB中的类

MATLAB中的任何变量都属于一个类,
MATLAB面向对象_及_AppDesigner使用_第1张图片
MATLAB中在新建类的时候,提供了最基本的模板,
MATLAB面向对象_及_AppDesigner使用_第2张图片

classdef Point2D < handle
    %----------------------------------------------------------------------
    % 类的属性
    %----------------------------------------------------------------------
    properties
        x
        y
    end
    
    properties(Dependent)            % 非独立属性,其值依赖于其他属性的值
        r
    end
    
    properties(Constant,Hidden)      % 同时设置属性为 常量属性、隐藏属性
        verInfo = '1.00版本,测试使用';
    end
    
    %----------------------------------------------------------------------
    % 类的方法
    %----------------------------------------------------------------------
    methods
        %-- 构造函数
        function obj = Point2D(x0,y0)
            if nargin == 0 
                obj.x = 10;
                obj.y = 20;
            elseif nargin == 2
                obj.x = x0;
                obj.y = y0;
            end
        end
        
        %-- 计算 非独立属性 的值
        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)]);
        end
    end
end

classdef Point3D < Point2D % 用<表示继承
    properties
        z
    end
    
    methods
        function obj = Point3D(x0,y0,z0)
            obj = obj@Point2D(x0,y0);
            obj.z = z0;
        end
        
        function print(obj)
            print@Point2D(obj);
            disp(['z=',num2str(obj.z)]);
        end
    end
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画图功能
    MATLAB面向对象_及_AppDesigner使用_第3张图片

mlapp文件基本格式

将mlapp文件作为zip文件打开,可以看到文件结构如下
MATLAB面向对象_及_AppDesigner使用_第4张图片

文件 描述
_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变量中
MATLAB面向对象_及_AppDesigner使用_第5张图片

MVC模式设计GUI

MATLAB面向对象_及_AppDesigner使用_第6张图片

模型(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简单使用

部分代码如下图
MATLAB面向对象_及_AppDesigner使用_第7张图片
使用虚拟串口软件,将app与串口调试助手相连接,测试情况如下图,
MATLAB面向对象_及_AppDesigner使用_第8张图片
需要注意的是其中,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)