一、面向对象编程(OOP)基本概念
OOP 的核心思想是将数据(属性)和操作数据的方法(函数)封装在“类”中,通过“对象”来使用这些功能。主要特性包括:
- 封装(Encapsulation):隐藏内部实现细节,仅通过接口与外界交互。
- 继承(Inheritance):子类可以继承父类的属性和方法,并可进行扩展或重写。
- 多态(Polymorphism):同一接口可用于不同类型的对象,实现不同的行为。
- 抽象(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
455

被折叠的 条评论
为什么被折叠?



