初识Matlab面向对象编程

前言

主要总结面向对象编程中的基本常见写法在matlab中是怎样的,方便以后查阅。

一个代码片段

classreg.learning.FullClassificationRegressionModel

classdef FullClassificationModel < ...
        classreg.learning.FullClassificationRegressionModel & classreg.learning.classif.ClassificationModel

    % 属性
    % 可读,只有其子类可以写
    % 该属性需要自定义读写函数
    properties(GetAccess=public,SetAccess=protected,Dependent=true)
        %Y True class labels used to train this model.
        %   The Y property is an array of true class labels. Y is of the same type
        %   as the passed-in Y data: a cell array of strings, categorical, logical,
        %   numeric or a character matrix.
        %
        %   See also classreg.learning.classif.FullClassificationModel.
        Y;
    end
    methods
        function y = get.Y(this)
            y = labels(this.PrivY);
        end
    end
    % 方法 读写权限继承都是protected
    methods(Access=protected)
        % 与类同名,构造函数
        % matlab中不支持函数重债,需要通过传入参数个数或varargin来实现
        function this = FullClassificationModel(X,Y,W,modelParams,...
                dataSummary,classSummary,scoreTransform)
                % 先调用基类的构造函数
                 this = this@classreg.learning.FullClassificationRegressionModel(...
                dataSummary,X,Y,W,modelParams);
            this = this@classreg.learning.classif.ClassificationModel(...
                dataSummary,classSummary,scoreTransform,[]);
            this.ModelParams = fillIfNeeded(modelParams,X,Y,W,dataSummary,classSummary);
        end
    end

    % 方法属性 Static 类方法
    methods(Static,Hidden)
        function [X,Y,W,userClassNames,nonzeroClassNames,rowsused] = ...
                processClassNames(X,Y,W,userClassNames,allClassNames,rowsused)
                 % 此处省略很多字
            end
    end
end

继承

代码片段的首行表示类FullClassificationModel继承了两个类FullClassificationRegressionModelClassificationModel,用classdef A < B & C 表示。
需要说明的是,matlab中的对象的继承方式都是public,即对继承方式没有限制。

属性(properties)

在MATLAB类的property块定义中,可以为属性直接赋一个值,此时为默认值。 如果默认值的赋值使用表达式,该表达式仅在类定义被MATLAB装载时执行一次,所以表达式计算的结果最好是固定。

常量(Constant)属性

在对象生存周期中值保持不变的属性,如果对该属性进行修改都将报错。 定义constant property需要用constant关键词。如果不显示给定常量属性一个特定的值,则默认为empty double。另外constant property不用创建对象就可以直接使用类中的常量。

非独立(Dependent)属性

定义:其值依赖于其他的属性,一旦其他的属性改变,该属性也做响应的变化,在概念上可以理解为
数学中的因变量。为了不需要每次都在自变量变化之后更新因变量,可以把该值设为dependent(依
赖)属性。
dependent属性特点:对象内部没有给属性分配物理的存储空间,每次该属性被访问时,其值将被动
态地计算出来。计算该属性的方法由get提供。

隐藏(Hidden)属性

隐藏的效果是在命令行中查看对象的信息时,该属性不会被显示出来。

类的方法(Method)

构造函数

和类的名称相同,用来创造类的实例。类定义中只能有一个constructor。constructor只能有一个返回值,且必须是新创建的对象。matlab中不支持函数重载,需要通过判断参数的个数nargin或借助varargin来实现。

析构函数

在对象脱离作用域或者被销毁时,负责收尾工作,比如关闭文件句柄、释放数据所占内存空间等。MATLAB规定:这类方法要命名为delete。无论Value或者Handle都需要用户定义自己的delete函
数。

抽象函数(虚函数)

  • 使用关键词Abstract来定义。
  • 定义抽象方法,只需要一行声明,不需要具体代码,并且该类的子类包括有一个同名的非抽象的办 -法。
  • matlab中的含抽象函数的抽象类,不能被实例化出对象的类,可以有构造函数,只是不能利用这个构造函数声明出对象来,该构造函数一般被子类构造函数所调用,需要显式调用。
  • 抽象类的子类必须实现抽象类中定义的所有抽象办法,否则,该子类仍然是抽象类。

静态(Static)方法

也叫作类方法,它为类服务,最明显的特征就是不需要对象就能使用。因为类的Constant Property
同样也为类服务,而不属于某个对象,所以静态方法可以访问类的Constant Property。类中的普通
方法可以访问静态方法,只需要在方法前面加上类名。

访问权限控制:

  1. Access=private:表示只有该类的成员方法可以访问该数据,而子类和其他外部函数无法访问
    该成员变量。
  2. Access=protected:表示只有该类的成员方法还有该类的子类而已访问该数据。
  3. Access=public:在类的定义中、类的成员方法、子类的成员和方法都可以访问这个成员变量,类之外的函数或者脚本也可以访问这个成员变量。

禁止继承

使用关键词sealed

classdef (sealed) A
end

  • 另一个办法就是把构造函数声明成private的,由于子类对象的建立必须要访问父类的构造函数,而
    private的构造函数将禁止子类的访问,所以该错误会出现在运行时,从而达到禁止继承的目的。
  • 基类的作者要确保该方法不被覆盖时,也可以在基类方法中使用Sealed关键词。

如何共享变量?

MATLAB不支持static变量。如果要让类的各个对象共享变量,可以在静态成员方法中定义一个persistent变量。比如可以用一个persistent变量计算对象创造的数量。

MetaClass:用一种普遍的方式来描述类

  1. 获得一个类的meta.class对象
    • 已知类的名字,可以在类名前面加上一个问号来获得meta.class
      例如:metaObj=?FileIterator
    • 有了一个类的对象,可以用meta.class函数来获得meta.class对象。
      如:metaObj=metaclass(obj);
    • 第三种方法最灵活:如果类的名字是以字符串的形式存在的,可以利用meta.class类中的成员方法fromName,该函数接受string input,返回meta.class对象。
      例如:
      name='Vehicle';metaObj=meta.class.fromName(name);
  2. meta.class可以做什么?
    系统地获得类中所有property的名字。

    metaobj=?Derived;
    propNameList={metaobj.PropertyList.Name} `

    • metaobj.PropertyList是一个对象数组,其中的内容是meta.property的对象
    • 使用.语法可以向量化访问数组中对象的共同属性
    • metaobj.PropertyList.Name返回的结果是string类型,由于string的长度不同,使用{}把返回的结果收集到元胞数组中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值