【问题标题】:Matlab OOP type checking for abstract superclassMatlab OOP 类型检查抽象超类
【发布时间】:2016-12-15 13:30:12
【问题描述】:

在许多编程语言中,例如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()' 方法确实有效,但我确实省略了 '

虽然限制Properties类的方法不起作用还是有点奇怪:

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

【问题讨论】:

    标签: matlab oop


    【解决方案1】:

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

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

    限制属性值的类时,必须限制该属性 到一个具体的类。 在属性“DataModule”的定义中替换抽象类“Core.Modularity.AbsBase” 类'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,它实际上是Core.Modularity.AbsClass0 x 0 实例。

    inst = MyClass()
    class(inst.DataModule)
    %   Core.Modularity.AbsClass
    
    size(inst.DataModule)
    %   0   0
    

    另一个选项是使用isa 来强制指定输入参数的类型。另外需要注意的是,isa 的第二个输入必须是一个字符串,这样您就不会遇到上述 MATLAB 尝试实例化抽象类的问题。

    classdef MyClass < handle
        methods
            function self = MyClass(cls)
                disp(isa(cls, 'Core.Modularity.AbsClass'))
            end
        end
    end
    

    【讨论】:

    • 我之所以需要这样做是因为它是modular application developmentinterface based programming 的基本方面。我需要确保我注入到我的消费类中的任何东西都将提供所需的功能,因此我理想地设计消费类以期望特定的依赖...
    • 顺便说一句,将参数强制为某种基本类型正是我想要做的......
    • @Kris 我假设您传递的是 Core.Modularity.AbsClass 而不是 字符串 'Core.Modularity.AbsClass'
    • @Kris 我已经更新了一些更多信息以及解决方法
    • 要清楚,您的第一个方法失败的原因并不完全(正如@Suever 建议的那样),因为它没有默认构造函数;这是因为它试图为属性设置默认值,该属性是 Abstract 类的空数组。这失败了,因为不可能创建一个抽象类的空数组,而不是因为默认构造函数不存在(即使它存在也不会在创建空数组时调用它)。我从来没有完全清楚为什么你不应该能够创建一个抽象类的空数组,但你不能。如果可以的话,它会很有用。
    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多