Main Content

修改继承的方法

何时修改超类方法

类设计使您可以将子类对象传递给超类方法。由于子类对象为超类对象,因此超类方法可以正确执行。但是,子类可以实现自己的超类方法版本,供 MATLAB® 在传递子类对象时调用。

当需要在子类中提供专门的行为时,子类会覆盖继承的方法(即,实现一个同名的方法)。以下是一些覆盖超类方法的模式。

  • 通过从子类方法内部调用超类方法来对超类方法进行扩展。子类方法除了调用超类方法外,还可以执行子类特定的处理。

  • 在超类方法中,使用受保护方法实现过程中的一系列步骤。然后,通过重新定义从公共超类方法内部调用的受保护方法,在子类方法中重新实现这些步骤。

  • 在子类中重新定义同名方法,但使用不同的实现以不同的方式对子类对象执行相同的操作。

  • 在子类中实现抽象超类方法。抽象超类可以定义无实现的方法,并依赖子类来提供实现。有关详细信息,请参阅定义接口超类

用于覆盖超类方法的子类方法为 Access 特性定义的值必须与超类方法所定义的值相同。

扩展超类方法

通过从子类方法调用同名的超类方法,您可以在不影响超类方法的情况下为子类对象扩展超类方法。

例如,假设超类和子类都定义了名为 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 (Sealed)
      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

在子类中实现抽象方法

抽象方法没有实现。继承抽象方法的子类必须提供子类特定的实现,该子类才能成为具体类。有关详细信息,请参阅抽象类和类成员

classdef Super
   methods (Abstract)
      foo(obj)
         % Abstract method without implementation
   end
end
classdef Sub < Super
   methods
      function foo(obj)
         % Subclass implementation of concrete method
      end
   end
end

相关主题