具体的Matlab类和抽象的属性成员类,这可能吗



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

最新更新