Main Content

在类定义中重载函数

为什么重载函数

类可以通过实现同名的方法来重新定义 MATLAB® 函数。在定义行为与现有 MATLAB 类型相似的特化类型时,重载非常有用。例如,您可以实现关系运算、绘图函数和其他常用的 MATLAB 函数来处理类中的对象。

您还可以通过实现控制默认行为的特定函数来修改这些行为。有关修改默认行为的函数的详细信息,请参阅Methods That Modify Default Behavior

实现重载的 MATLAB 函数

类方法可以提供仅对类实例运行的 MATLAB 函数的实现。这种限制是允许的,因为 MATLAB 可以始终识别对象属于哪个类。

MATLAB 使用主导参量来确定要调用函数的哪个版本。如果主导参量是对象,则 MATLAB 调用由该对象的类定义的方法(如果存在的话)。

如果类定义了一个与全局函数同名的方法,则该类对该函数的实现称为重载原始全局实现。

要重载 MATLAB 函数,请执行以下操作:

  • 定义与要重载的函数同名的方法。

  • 确保方法参量列表接受类的对象,MATLAB 使用该对象来确定调用哪个版本。

  • 执行方法中的必要步骤来实现该函数。例如,访问用于操作数据的对象属性。

通常,重载函数的方法会产生类似于 MATLAB 函数的结果。但是,关于如何实现重载方法不做要求。重载方法不需要与重载函数的签名相匹配。

注意

MATLAB 不支持在同一类中定义多个具有相同名称但具有不同签名的方法。

重载 bar 函数

重载常用函数来处理类的对象可为我们提供方便。例如,假设有一个类定义了一个属性,用来存储您经常绘制的数据。MyData 类覆盖 bar 函数,并在图中添加标题:

classdef MyData
   properties
      Data
   end
   methods
      function obj = MyData(d)
         if nargin > 0
            obj.Data = d;
         end
      end
      function bar(obj)
         y = obj.Data;
         bar(y,'EdgeColor','r');
         title('My Data Graph')
      end
   end
end

MyData bar 方法与 MATLAB bar 函数同名。但是,MyData bar 方法需要 MyData 对象作为输入。由于该方法针对 MyData 对象而特化,因此它可以从 Data 属性中提取数据并创建特化图。

要使用 bar 方法,请创建一个对象:

y = rand(1,10);
md = MyData(y);

使用该对象调用方法:

bar(md)

您也可以使用圆点表示法:

md.bar

实现 MATLAB 运算符

设计用来实现新 MATLAB 数据类型的类通常会定义一些运算符,如表示加法、减法或相等性的运算符。

例如,标准 MATLAB 加法 (+) 无法将两个多项式相加,因为该运算不是由简单加法定义的。但是,polynomial 类可以定义自己的 plus 方法,MATLAB 语言调用该方法来使用 + 符号执行 polynomial 对象的相加:

p1 + p2

有关重载运算符的信息,请参阅运算符重载

避免冲突的命名规则

方法、属性和事件的名称的作用域限于类内。因此,请遵守以下规则以避免名称冲突:

  • 您可以重用在不相关类中使用的名称。

  • 如果成员没有公共或受保护访问权限,则可以在子类中重用名称。然后,这些名称便可以引用完全不同的方法、属性和事件,而不会影响超类定义

  • 在一个类中,所有名称都存在于相同的命名空间中,并且必须唯一。一个类无法定义两个同名的方法,而且一个类无法定义与方法同名的局部函数。

  • 静态方法的名称被认为没有其类前缀。因此,没有类前缀的静态方法名称不能与任何其他方法的名称相同。

相关主题