本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

修改继承的方法

何时修改超类方法

类设计使您能够将子类对象传递给超类方法,并使该方法正确执行。同时,子类方法可以对子类的独特方面进行特殊处理。一些有用的编程方式包括:

  • 扩展 - 从子类方法中调用超类方法

  • 重定义 - 在子类中重新实现从公共超类方法中调用的受保护方法

  • 覆盖 - 在超级和子类中定义具有相同名称的方法,但它们使用不同的实现

扩展超类方法

子类方法可以调用同名的超类方法。这种编程方式使您能够在子类中扩展超类方法,而无需完全重新定义超类方法。

例如,假设超类和子类都定义了名为 foo 的方法。方法名称是相同的,因此子类方法可以调用超类方法。然而,子类方法也可以在调用超类方法之前和之后执行其他步骤。它可以对子类中不属于超类的特化部分进行操作。

例如,以下子类定义一个 foo 方法,该方法调用超类 foo 方法:

classdef Sub < Super
   methods
      function foo(obj)
         % preprocessing steps
          ...
         foo@Super(obj);
         % postprocessing steps
          ...
      end
   end
end

在子类中重新定义超类方法

超类方法可以定义执行一系列步骤的过程,每个步骤都使用受保护的方法(Access 属性设置为 protected)。然后,子类可以创建自己版本的受保护方法来实现过程的各个步骤。

这种编程方式的实现如下所示:

classdef Super
   methods
      function foo(obj)
         step1(obj) % Call step1
         step2(obj) % Call step2
         step3(obj) % Call step3
      end
   end
   methods (Access = protected)
      function step1(obj)
         % Superclass version
      end
      function step2(obj)
         % Superclass version
      end
      function step3(obj)
         % Superclass version
      end
   end
end

子类并不重新实现 foo 方法,它只重新实现执行一系列步骤的方法(step1(obj)step2(obj)step3(obj))。也就是说,子类可以特化每个步骤所采取的操作,但不控制过程中各步骤的顺序。当您将子类对象传递给超类 foo 方法时,根据调度规则,MATLAB® 会调用子类步骤的方法。

classdef Sub < Super
   ...
   methods (Access = protected)
      function step1(obj)
         % Subclass version
      end
      function step2(obj)
         % Subclass version
      end
      function step3(obj)
         % Subclass version
      end
      ...
   end
end

覆盖超类方法

您可以在子类中彻底重新定义超类方法。在这种情况下,超类和子类都定义同名的方法。然而,实现会有所不同,并且子类方法不会调用超类方法。

classdef Super
   methods
      function foo(obj)
         % Superclass implementation
      end
   end
end
classdef Sub < Super
   methods
      function foo(obj)
         % Subclass implementation
      end
   end
end

相关主题