在许多编程语言中,例如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
答案 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