Matlab OOP类型检查抽象超类

时间:2016-12-15 13:30:13

标签: matlab oop

在许多编程语言中,例如C#可以为类构造函数提供参数类型。

类似的东西:

MyConstructor(IDependencyClass)

在这里,' IDependencyClass'是一个界面。这允许您使用依赖注入和组件的松散耦合。

Matlab也支持OOP,即使它没有强类型,也没有提供类接口(AFAIK)这样的概念,我天真地认为我可以使用以下任何一种变体:

classdef (Abstract) AbsClass 
   ...
end

接下来,在任何会依赖AbClass的类中,我会像这样创建一个私有属性:

properties (Access = private)

    % The DataModule type is restricted AbsClass.
    DataModule Core.Modularity.AbsBase

end

然后可以在构造时设置此属性。

或者,我可以使用类似的东西检查构造函数:

isa(input argument, 'Core.Modularity.AbsBase')

奇怪的是,Matlab并不想打球,引发了错误:

Abstract classes cannot be instantiated.  
Class 'Core.Modularity.AbsClass' defines abstract methods and/or properties

对我来说,这有点奇怪......显然Matlab的类型检查机制想要创建一个抽象类的实例,这显然是不可能的。

如果你想设计一个适合中高复杂度的应用程序,那么无法做到这一点是一个巨大的缺点。

我错过了什么?

修改

相当愚蠢,但事实证明' isa()'方法确实有效,但我确实省略了'

虽然限制属性类方法仍然有点奇怪但是仍然有点奇怪:

https://www.mathworks.com/help/matlab/matlab_oop/restrict-class-of-properties.html

1 个答案:

答案 0 :(得分:2)

问题在于,如果要限制给定属性的类,MATLAB需要为该属性(该类的属性)创建一个默认空值,因此empty方法必须能够成功叫(Core.Modularity.AbsClass.empty()),但因为它是一个抽象类,所以这是不可能的。

尝试这样做会导致此错误:

  

限制属性值的类时,必须限制该属性   到一个具体的课程。   替换抽象类' Core.Modularity.AbsBase'在财产的定义' DataModule'在   class' MyClass'。

现在技术上 you can use the old (and undocumented) syntax for restricting the class of a property,显然它可行

classdef MyClass
    properties
        DataModule@Core.Modularity.AbsBase
    end
end

奇怪的是,如果我们检查DataModule,它实际上是0 x 0的{​​{1}}个实例。

Core.Modularity.AbsClass

另一种选择是使用inst = MyClass() class(inst.DataModule) % Core.Modularity.AbsClass size(inst.DataModule) % 0 0 来强制执行给定输入参数的类型。同样重要的是要注意isa的第二个输入必须是一个字符串,这样你就不会遇到与上面相同的问题,而MATLAB试图实例化一个抽象类。

isa