Class 如何访问/读取octave中的类实例属性?
使一个类与我在类实例中附加的参数中的类相似,如下所示Class 如何访问/读取octave中的类实例属性?,class,oop,properties,octave,getter-setter,Class,Oop,Properties,Octave,Getter Setter,使一个类与我在类实例中附加的参数中的类相似,如下所示 function t = train (m, F_z, F_b, varargin) ... t.m = m; % total mass of train [kg] t.F_z = F_z; % ... ... t = class (t, "train"); 获取字段名是有效的 >> t1 = train(100, 150000, 200000); ... >> fie
function t = train (m, F_z, F_b, varargin)
...
t.m = m; % total mass of train [kg]
t.F_z = F_z; % ...
...
t = class (t, "train");
获取字段名是有效的
>> t1 = train(100, 150000, 200000);
...
>> fieldnames(t1)
ans =
{
[1,1] = m
[2,1] = F_z
...
但我如何访问这些?显然不是
>> t1.m
error: invalid index for class
>> getfield(t1, 'm')
error: invalid index for class
error: called from
...
如果我省略了行
t=class(t,'train')在@train/train.m
中的函数t=train(m..
的末尾,这些东西似乎都很好地工作……但是它是一个结构,而不是一个类
你可以用两种方法来实现。你可以定义一个方法来检索它(简单),或者你可以设置subsref
(下标参考)(困难)
要定义一种方法,只需使用以下内容创建@train/m.m
:
function r = m ()
r = t.m;
endfunction
function r = subsref (val, idx)
if (strcmp (idx.type, ".") && strcmp (idx.subs, "m"))
r = val.m;
endif
endfunction
要设置订阅,请使用以下命令创建@train/subsref.m
:
function r = m ()
r = t.m;
endfunction
function r = subsref (val, idx)
if (strcmp (idx.type, ".") && strcmp (idx.subs, "m"))
r = val.m;
endif
endfunction
这将允许您仅访问字段m
。要访问类中的任何属性,您只需执行以下操作:
function r = subsref (val, idx)
r = subsref (struct (val), idx);
endfunction
要允许访问属性子集,您可以:
function r = subsref (val, idx)
if (strcmp (idx.type, ".") && any (strcmp (idx.subs, {"m", "f2", "F_z"})))
r = val.(idx.subs{1});
endif
endfunction
但是subsref
控制所有的索引,不仅仅是在作为结构访问对象时。您可以允许人们对对象进行索引(可能您有一个货车类,火车会返回它们)。该函数在开始时看起来有点奇怪(就像subsasgn
(下标分配)),但可能非常有用。您可以执行以下操作:
function r = subsref (val, idx)
if (strcmp (idx.type, ".") && strcmp (idx.subs, "m"))
r = val.m;
elseif (strcmp (idx.type, "()"))
r = val.wagons(idx.subs{:});
endif
endfunction
一种快速而肮脏的方法是在八度音阶中打破OOP原理。无需定义subsref
或getter
方法。要访问字段,只需将对象转换为结构即可
>> t1 = train(100, 150000, 200000);
>> t1_easy = struct(t1);
>> t1_easy.m
>> t1_easy.F_z
如果要使用“.”访问它们,必须定义它: