在许多编程语言(例如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类方法不起作用仍然有点奇怪:
发布于 2016-12-15 05:34:56
问题是,如果您想限制给定属性的类,MATLAB需要为该属性(该类)创建一个默认值,因此必须能够成功地调用empty
方法(Core.Modularity.AbsClass.empty()
),但是由于它是一个抽象类,这是不可能的。
尝试这样做,会导致以下错误:
当限制属性值的类时,必须将属性限制为具体的类。在“MyClass”中属性'DataModule‘的定义中替换抽象类’DataModule‘。
现在从技术上讲,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.AbsClass
的一个0 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
https://stackoverflow.com/questions/41165387
复制