Oop MATLAB:将一个类从空实例实例化为';空白';实例
为什么我的实例化函数不创建该函数的“空白”实例 我有以下最低等级:Oop MATLAB:将一个类从空实例实例化为';空白';实例,oop,class,matlab,Oop,Class,Matlab,为什么我的实例化函数不创建该函数的“空白”实例 我有以下最低等级: classdef That < handle properties This = '' end methods function Self = That(String) if exist('String','var') == 1 Self.This = String; end end function Self = Instantiate(Self) if isempty(S
classdef That < handle
properties
This = ''
end
methods
function Self = That(String)
if exist('String','var') == 1
Self.This = String;
end
end
function Self = Instantiate(Self)
if isempty(Self)
Self(1,1) = That;
end
end
end
end
这一切都很好,我有一个“空白”的类实例
如果我跑
This = That;
disp(size(This)) % 1x1
disp(isempty(This)) % False
TheOther = That.empty;
disp(size(TheOther)) % 0x0
disp(isempty(TheOther)) % True
TheOther.Instantiate;
disp(size(TheOther)) % 0x0 - Expecting 1x1
disp(isempty(TheOther)) % True - Expecting False
正如您所看到的,运行我的实例化不起作用,我也不明白为什么?当然,它应该用一个非空但为空的实例替换空实例吗
更新:
SCFrench的链接在标题“创建空数组”下指向此链接,但这也不起作用:
function Self = Instantiate(Self)
if isempty(Self)
Blank = That;
Props = properties(Blank)
for idp = 1:length(Props)
Self(1,1).(Props{idp}) = Blank.(Props{idp});
end
end
end
也许你应该把它变成一个静态函数:
methods (Static)
function Self = Instantiate(Self)
if isempty(Self)
Self(1,1) = That;
end
end
end
然后:
MATLAB按值传递句柄对象数组(包括1×1“标量”数组)。句柄值是对对象的引用,可用于更改对象的状态(即其属性),但重要的是,它不是对象本身。如果将句柄值数组传递给函数或方法,则数组的副本实际上会传递给函数,修改副本的维度对原始数组没有影响。事实上,当你打电话的时候
TheOther.Instantiate;
分配给Self(1,1)
的实例作为Instantiate
的输出返回,并分配给ans
对于MATLAB面向对象设计文档的一部分也可能有所帮助。您对变量名称的选择真的很重要:)这是一场关于这个、那个和另一个的游戏,厌倦了到处看到foobar:DIMO具体示例总是更好;类似于一个学生
类,有名称
属性。我已经在实际代码上这样做了,下次在这里也会这样做:如果我必须这样做,那么做另一个就更简单了。我真的在处理一棵对象树,所以我真的在分配这个。那个。那个。那个。另一个。或者可能是什么东西,我真的很想实例化,因为我发现了空括号。我不确定这是否有帮助,但是这个关于用handle类实例创建节点链表的演示可能会给你一些想法:最后我选择了Parent.Sub=Sub
。感谢您的帮助,那么我如何让ans分配回另一个实例呢?我的理解是,进入实例化的参数Self应该是对另一个实例的引用,然后我肯定能够填充原始实例?然后我可以使实例非空。重复使用道具不起作用(张贴在上面)@Carel:你真的应该重新考虑你的类设计,Instantiate
不应该是成员函数;可能是一个助手函数,或者像我建议的那样是一个静态函数。我可以问一下你的建议吗?目前,我正在考虑重写empty来创建一组空的项,然后重写isempty来声明它们是空的,如果它们的值是默认值。
TheOther.Instantiate;