MATLAB - 类和对象



在 MATLAB 中,使用类和对象可以更有效地组织和管理复杂的程序。MATLAB 中的面向对象编程 (OOP) 使您可以创建封装数据和函数的对象,从而提高模块化、可重用性和清晰度。

理解类和对象

  • − 类是创建对象的蓝图。它定义了对象将具有的属性(数据)和方法(函数)。
  • 对象 − 对象是类的实例。它包含类中定义的数据和函数。

使用类和对象的益处

  • 模块化 − 将您的程序分解成更小、更易于管理的部分(对象),每个部分都有特定作用。
  • 可重用性 − 通过定义可在不同项目中使用的类来创建可重用代码。
  • 可维护性 − 更易于维护和更新代码,因为对类的更改会自动应用于由此类创建的所有对象。
  • 封装 − 通过限制对数据的直接访问并仅允许通过定义的方法进行修改来保护数据安全。

关键概念

  • 属性 − 存储特定于对象的变量。例如,BankAccount 类可能具有 AccountNumber 和 Balance 等属性。
  • 方法:对对象数据进行操作的函数。例如,BankAccount 类可能具有 deposit 和 withdraw 等方法。

在 Matlab 中创建类

在 MATLAB 中创建简单的类涉及定义类定义文件,指定属性(数据成员)和类将具有的方法(函数)。以下是如何创建简单的 MATLAB 类的分步方法。

首先要做的是创建一个文件,为此请按照以下步骤操作:

  • 打开 Matlab
  • 转到“主页”选项卡,然后单击“新建脚本”以创建新文件。
  • 使用“.m”扩展名保存文件,并将类文件命名为 MyClass.m。请记住,文件名必须与类名匹配。

如何在 matlab 中完成此操作的屏幕截图如下所示:

接下来将开始定义类

打开 MyClass.m 文件并使用 classdef 关键字,这是一个类的基本框架。

classdef MyClass
    properties
        % Define properties (data members) here
        Property1
        Property2
    end
    
    methods
        % Define methods (functions) here
        function obj = MyClass(inputArg1, inputArg2)
            % Constructor method
            obj.Property1 = inputArg1;
            obj.Property2 = inputArg2;
        end
        
        function result = myMethod(obj, inputArg)
            % Example method
            result = obj.Property1 + inputArg;
        end
    end
end

现在让我们进入类细节。首先让我们讨论属性。

定义属性

属性是类的成员数据。在 properties 块内定义它们。例如,假设我有两个属性,Property1 和 Property2。

在我的类 MyClass.m 中的属性定义如下。

properties
    Property1
    Property2
end

完成属性定义后,我们将继续定义方法。

定义类的函数

方法是对类中的数据进行操作的函数。它们在 methods 块中定义。

我们有两种方法:构造函数和常规方法。

让我们首先了解构造函数

构造函数 − 创建类的实例时调用此方法。使用与类相同的名称定义它。

function obj = MyClass(inputArg1, inputArg2)
    % Constructor method
    obj.Property1 = inputArg1;
    obj.Property2 = inputArg2;
end

常规方法 − 这些是对类属性进行操作的常规函数。使用任何您喜欢的名称定义它们。

function result = myMethod(obj, inputArg)
    % Example method
    result = obj.Property1 + inputArg;
end

现在我们已将类保存为 MyClass.m,您现在可以创建 MyClass 的实例并从 MATLAB 命令窗口调用其方法,如下所示。

obj = MyClass(10, 20);
disp(obj.Property1)
disp(obj.Property2)
result = obj.myMethod(5)
disp(result)

在 matlab 命令窗口中执行后,输出为:

>> obj = MyClass(10, 20);
disp(obj.Property1)
disp(obj.Property2)
result = obj.myMethod(5)
disp(result)

    10

    20

result =

    15

    15

MATLAB 中的 classdef 关键字

MATLAB 中的 classdef 关键字用于定义一个新类。

语法

classdef (Attributes) ClassName < SuperclassNames
    properties (Attributes) ... end
    methods (Attributes) ... end
    events (Attributes) ... end
    enumeration ... end
end

让我们详细了解语法。

classdef (属性) 类名 < 超类名

  • classdef − 用于定义类的关键字。
  • 属性 − 指定类的某些属性的可选属性(例如,Sealed、Abstract、HandleCompatible)。
  • 类名 − 类的名称。
  • 超类名 − 此类继承自的一个或多个类的列表(即其超类或超类)。

属性块

属性 (属性) − 定义类的成员数据属性。属性存储特定于对象的数据。

properties (Attributes)
     PropertyName
end

属性 − 指定类属性的某些属性的可选属性(例如,Constant、Dependent、Access)。

方法块

方法 (属性) − 定义类的函数(方法)。方法对类的对象执行操作。

methods (Attributes)
    function obj = MethodName(obj, args)
    end
end

属性 − 指定方法的某些属性的可选属性(例如,Static、Abstract、Access)。

事件块

事件 (属性) − 定义类可以触发的事件。事件允许对象将更改或操作传达给其他对象。

events (Attributes)
    EventName
end

属性 − 指定事件的某些属性的可选属性。

枚举块

枚举 − 使用一组固定的命名值定义枚举类。枚举类可用于定义一组相关的常量。

enumeration
    EnumMember
end

这是一个简单的类定义示例。

classdef (Sealed) MyClass < SuperClass
    properties (Access = private)
        Property1
    end

    methods
        function obj = MyClass(inputArg)
            obj.Property1 = inputArg;
        end

        function output = myMethod(obj, inputArg)
            output = obj.Property1 + inputArg;
        end
    end

    events
        Event1
    end

    enumeration
        EnumMember1, EnumMember2
    end
end

在这个例子中。

  • MyClass 是一个继承自 SuperClass 的类。
  • 该类被标记为 Sealed,这意味着它不能被子类化。
  • 它有一个私有属性 Property1。
  • 它有一个构造函数 MyClass 和另一个方法 myMethod。
  • 它定义了一个事件 Event1。
  • 它有两个枚举成员 EnumMember1 和 EnumMember2。

MATLAB 中的 class(obj)

MATLAB 中的 class 函数用于确定对象的类(类型)。此函数返回一个字符向量,该向量指定输入对象的类名。它对于内省特别有用,在内省中,您需要在运行时知道对象的类型。

语法

className = class(obj)

在上述语法中

  • obj − 您要确定其类类型的对象。这可以是任何 MATLAB 变量,包括数组、结构体、函数句柄或自定义类的对象。
  • className:表示输入对象 obj 的类的名称的字符向量。

请注意

  • 当您将内置类型(例如,double、char、cell)传递给 class 函数时,它会返回该类型的名称。
  • 当您传递自定义类的对象时,它会返回该类的名称。
  • 此函数可用于调试以及编写需要根据其输入的类而不同地运行的函数。

让我们看几个例子。

示例 1:内置类型

% Determine the class of a numeric array
a = [1, 2, 3];
className = class(a)

% Determine the class of a string
str = 'Hello, World!';
className = class(str)

% Determine the class of a cell array
c = {1, 2, 3};
className = class(c)

在 matlab 命令窗口中执行后,输出为:

>> % Determine the class of a numeric array
a = [1, 2, 3];
className = class(a)

% Determine the class of a string
str = 'Hello, World!';
className = class(str)

% Determine the class of a cell array
c = {1, 2, 3};
className = class(c)

className = double
className = char
className = cell

示例 2:自定义类

假设您有一个如下定义的自定义类 MyClass。

classdef MyClass
    properties
        Property1
        Property2
    end
    
    methods
        function obj = MyClass(inputArg1, inputArg2)
            % Constructor method
            obj.Property1 = inputArg1;
            obj.Property2 = inputArg2;
        end
        
        function result = myMethod(obj, inputArg)
            % Example method
            result = obj.Property1 + inputArg;
        end
    end
end

您可以创建此类的对象并使用 class 函数来确定其类型。

% Create an instance of MyClass
obj = MyClass(10, 20)

% Determine the class of the object
className = class(obj)

在 matlab 命令窗口中执行后,输出为:

>> % Create an instance of MyClass
obj = MyClass(10, 20)

% Determine the class of the object
className = class(obj)

obj = 

  MyClass with properties:

    Property1: 10
    Property2: 20

className =

    'MyClass'

>> 

MATLAB 中的 isobject() 函数

MATLAB 中的 isobject() 函数用于确定变量是否为用户定义类的对象。当您需要在执行特定于对象的运算之前检查变量的类型时,这将特别有用。

在MATLAB中,变量可以属于不同的数据类型,包括数值数组、字符数组、结构体、元胞数组和对象。MATLAB中的对象是类的实例,该类可以是内置类或用户定义类。`isobject`函数有助于识别给定变量是否为对象。

语法

tf = isobject(A)

在上文的语法中:

  • A − 要测试的变量。
  • tf − 一个逻辑值(真或假)。如果A是对象,则返回真;否则返回假。

让我们看几个例子

示例1:检查数值数组

A = [1, 2, 3, 4, 5];
tf = isobject(A);
disp(['Is A an object? ', num2str(tf)]);

在上例中,`tf = isobject(A);` 检查A是否为对象。

在 matlab 命令窗口中执行后,输出为:

>> A = [1, 2, 3, 4, 5];
tf = isobject(A);
disp(['Is A an object? ', num2str(tf)]);

Is A an object? 0
>>

示例2:检查结构体

我们的代码是

B = struct('field1', 10, 'field2', 20);
tf = isobject(B);
disp(['Is B an object? ', num2str(tf)]);

这里`tf = isobject(B);` 检查B是否为对象。

在 matlab 命令窗口中执行后,输出为:

>> B = struct('field1', 10, 'field2', 20);
tf = isobject(B);
disp(['Is B an object? ', num2str(tf)]);

Is B an object? 0
>> 

示例3:检查用户自定义对象

首先,在一个名为MyClass.m的文件中定义一个自定义类MyClass

我们的代码是。

% MyClass.m
classdef MyClass
    properties
        Property1
        Property2
    end
    
    methods
        function obj = MyClass(val1, val2)
            obj.Property1 = val1;
            obj.Property2 = val2;
        end
    end
end

现在,创建一个此类的实例并检查它是否为对象。

C = MyClass(10, 20);

tf = isobject(C);
disp(['Is C an object? ', num2str(tf)]);

在上例代码中,`tf = isobject(C);` 检查C是否为对象。

在MATLAB命令窗口中执行后的输出是。

>> C = MyClass(10, 20);

tf = isobject(C);
disp(['Is C an object? ', num2str(tf)]);

Is C an object? 1
>> 
广告