MATLAB 面向对象编程

一、面向对象编程(OOP)基本概念

OOP 的核心思想是将数据(属性)和操作数据的方法(函数)封装在“类”中,通过“对象”来使用这些功能。主要特性包括:

  1. 封装(Encapsulation):隐藏内部实现细节,仅通过接口与外界交互。
  2. 继承(Inheritance):子类可以继承父类的属性和方法,并可进行扩展或重写。
  3. 多态(Polymorphism):同一接口可用于不同类型的对象,实现不同的行为。
  4. 抽象(Abstraction):通过抽象类或接口定义通用行为。

二、MATLAB 中类的定义

MATLAB 中的类定义在 .m 文件中,文件名必须与类名一致。类使用 classdef 关键字定义。

基本语法结构:

classdef ClassName < SuperClass1 & SuperClass2
    properties (Access = public)
        Property1
        Property2
    end

    methods
        function obj = ClassName(arg1, arg2)
            % 构造函数
            if nargin > 0
                obj.Property1 = arg1;
                obj.Property2 = arg2;
            end
        end

        function result = someMethod(obj, input)
            % 普通方法
            result = obj.Property1 + input;
        end
    end

    methods (Access = private)
        function helper(obj)
            % 私有方法
        end
    end

    events
        EventName
    end

    listeners
        % 事件监听器
    end
end

三、核心组成部分详解

1. properties

定义类的属性(成员变量),可设置访问权限:

  • public:任何代码可访问(默认)
  • private:仅类内部方法可访问
  • protected:类及其子类可访问
properties (SetAccess = private, GetAccess = public)
    Count = 0;  % 初始化值
end

2. methods

定义类的方法(成员函数)。

构造函数
  • 方法名与类名相同。
  • 返回对象 obj
  • 若未定义,MATLAB 提供默认无参构造函数。
普通方法
  • 第一个参数通常是 obj(对象本身)。
  • 可修改对象属性(需声明 obj 为输入输出):
function obj = incrementCount(obj)
    obj.Count = obj.Count + 1;
end

3. 继承(Inheritance)

使用 < 符号继承父类,支持多重继承(仅限于混合类,如 handle)。

classdef Vehicle
    properties
        Speed
    end
    methods
        function obj = Vehicle(speed)
            obj.Speed = speed;
        end
    end
end

classdef Car < Vehicle
    properties
        NumDoors
    end
    methods
        function obj = Car(speed, doors)
            obj@Vehicle(speed);  % 调用父类构造函数
            obj.NumDoors = doors;
        end
    end
end

4. 句柄类(Handle Classes) vs 值类(Value Classes)

  • 值类(默认):赋值时复制对象(类似结构体)。
  • 句柄类:继承 handle 类,赋值时传递引用。
classdef MyHandleClass < handle
    properties
        Data
    end
end

用途:GUI、回调函数、需共享状态时使用句柄类。

5. 静态方法与属性

  • 不依赖于对象实例,通过类名调用。
  • 使用 Static 关键字。
methods (Static)
    function result = computeArea(radius)
        result = pi * radius^2;
    end
end

properties (Constant)
    Pi = 3.14159;  % 常量属性
end

调用方式:MyClass.computeArea(5)

6. 事件与监听器(Events and Listeners)

用于实现观察者模式,常用于 GUI 或状态变化通知。

events
    ValueChanged
end

methods
    function setValue(obj, val)
        oldVal = obj.Value;
        obj.Value = val;
        notify(obj, 'ValueChanged', event.EventData);
    end
end

监听:

lh = addlistener(obj, 'ValueChanged', @(src,evt) disp('Value changed!'));

四、高级特性

1. 抽象类与抽象方法

  • 使用 Abstract 属性定义抽象方法。
  • 抽象类不能实例化。
classdef AbstractShape < handle
    methods (Abstract)
        area(obj)
    end
end

2. 枚举类(Enumerations)

定义一组命名常量。

classdef Color < int32
    enumeration
        Red (1), Green (2), Blue (3)
    end
end

3. 属性验证与限制

properties
    Age (1:150)  % 数值范围限制
        validateattributes(Age, {'numeric'}, {'scalar','positive'})
    end
end

4. 属性访问方法(Get/Set)

重写属性的读取和写入行为:

methods
    function value = get.Property1(obj)
        value = obj.Property1 * 2;  % 自定义获取逻辑
    end

    function obj = set.Property1(obj, value)
        if value < 0, error('Must be positive'); end
        obj.Property1 = value;
    end
end

五、OOP 在 MATLAB 中的应用场景

场景说明
GUI 开发使用 handle 类管理 UI 组件状态
控制系统建模封装控制器、传感器等为对象
数据封装将数据与处理方法绑定,如信号处理类
工具箱开发构建可重用、模块化的函数库
仿真系统定义实体类(如车辆、机器人)进行仿真

六、示例:简单的银行账户类

% File: BankAccount.m
classdef BankAccount < handle
    properties
        Balance = 0;
    end

    methods
        function obj = BankAccount(initial)
            if nargin > 0
                obj.Balance = initial;
            end
        end

        function deposit(obj, amount)
            if amount <= 0
                error('Amount must be positive.');
            end
            obj.Balance = obj.Balance + amount;
        end

        function withdraw(obj, amount)
            if amount > obj.Balance
                error('Insufficient funds.');
            end
            obj.Balance = obj.Balance - amount;
        end

        function displayBalance(obj)
            fprintf('Current balance: $%.2f\n', obj.Balance);
        end
    end
end

使用示例:

acc = BankAccount(100);
acc.deposit(50);
acc.displayBalance();  % 输出: Current balance: $150.00

七、参考资料

  • MATLAB 官方文档:Object-Oriented Programming
  • 书籍推荐:《MATLAB Object-Oriented Programming: Object-Oriented Programming in MATLAB》by Andy McGee
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值