Matlab新手,但被迫将其用于新的工作项目。。。我有C++的背景,但也许我不应该尝试用Matlab模拟C++的编码范式。我正试图弄清楚如何拥有一个抽象类属性,当使用具体成员调用构造函数时,该属性将被初始化。例如:
%AbstractClass.m
classdef (Abstract) AbstractClass < handle
end
%ConcreteClass.m
classdef ConcreteClass < AbstractClass
end
%myclass.m
classdef myclass < handle
properties
% X {AbstractClass} % would like to have this be like C++ nullptr
%X {AbstractClass} % can't initialize...
%X % Works, but not safe
X {mustBeA(X, 'AbstractClass')} % Suggested, error below
end
methods
% constructor
function obj = myclass( concreteInstanceOfAbstractClass )
obj.X = concreteInstanceOfAbstractClass
end
end
end
但是当我试着运行这个时
Y = ConcreteClass()
mustBeA(AbstractClass, Y) % no error, fine
mustBeA(ConcreteClass, Y) % no error, fine
A = myclass(Y) % throws error below
我得到以下错误
>> A = myclass(Y)
Error using implicit default value of property 'X' of class 'myclass'. Value must be one of the following types: 'AbstractClass'.
有没有一种方法可以使用抽象类的具体实例在构造函数中初始化类?我已经做了一些搜索,但我对Matlab还不够熟悉,可能找不到合适的地方。在C++中,这将是一件非常常见的事情。
尝试
properties
X {mustBeA(X, 'AbstractClass')}
end
其是属性验证器而不是类约束。
根据下面的评论,我意识到问题是MATLAB坚持在classdef
中有一个默认值。不幸的是,这让事情变得困难。一种方法是提供一个有效的具体类作为默认值。这项工作:
properties
X AbstractClass = ConcreteClass
end
但是要求使用类知道CCD_ 2的名称。另一种方法(特别是如果只需要在施工时设置属性(是这样的:
classdef Uses
properties (SetAccess = immutable)
% No constraints here
Property
end
methods
function obj = Uses(val)
arguments
% Enforce constraints here - scalar instance
% of something inheriting from AbstractClass
val (1,1) AbstractClass
end
obj.Property = val;
end
end
end