修改继承的方法
何时修改超类方法
类设计使您可以将子类对象传递给超类方法。由于子类对象为超类对象,因此超类方法可以正确执行。但是,子类可以实现自己的超类方法版本,供 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