我希望在nansubset
类中添加一个名为table
的方法。从本质上讲,它允许您拨打T(r,c)
,其中r
和c
是真正的正整数向量,可能包含NaN
。
nansubset.m
的存根代码可以是:
function T = nansubset(T, r, c)
T = T(r,c);
end
我按照说明here详细说明了如何向cell
类添加新方法。基本上,在我的Matlab路径上的文件夹中,我创建了一个名为@table
的文件夹,并在此文件夹中创建一个名为nansubset.m
的文件。
我遇到了以下问题:
>> tmpT = table(); nansubset(tmpT, 1, 1)
Undefined function 'nansubset' for input arguments of type 'table'.
和
>> doc @table/nansubset
Your search - @table/nansubset - did not match any documents.
然而:
edit nansubset
和
edit @table/nansubset
都在我的编辑器中打开方法文件。
此外,我按照上述链接中的说明将plus
方法添加到cell
类,并发现它完美无缺。
有人可以向我解释如何将这个额外的方法添加到table
课程中吗?
答案 0 :(得分:3)
随着Matlab R2012b(版本8)的发布,the class folder behavior changed(强调是我的):
在MATLAB版本5到7中,类文件夹不会影响具有相同名称但位于以后路径文件夹中的其他类文件夹。相反,类具有相同名称的所有类文件夹中的方法组合定义了类。这不再是真的。
为了向后兼容,在类文件夹中定义的类始终优先于具有相同名称的函数和脚本,甚至优先于路径上它们之前的那些。
两个粗体语句的组合解释了行为:
cell
是一个内置的Matlab函数,它早于返回其类实例的新OOP规则。在R2012b之前,将方法添加到名为@cell
的类文件夹中,将方法添加到从cell
函数返回的对象(未使用classdef
或类文件夹定义);保留此功能是为了与旧版用户代码兼容。table
,通过类文件夹定义,并且是Sealed
。由于它是Sealed
,因此无法进行子类化。使用新规则,任何没有关联@table
文件的classdef
文件夹都不会注册为类文件夹,也不会将其方法组合到现有类中,除非它是遗留系统的一部分(如{ {1}})。我可以看到我认为最好的顺序中列出的三种解决方法:
cell
是一个值类,因此该选项看起来并不糟糕。创建一个如下所示的包装类。它很麻烦,但会自动封装附加功能。
table
classdef MyTable < handle
properties
tab;
end
methods
function mytab = MyTable(varargin)
mytab.tab = table(varargin{:});
end
function tabnan = nansubset(mytab,r,c)
tabnan = mytab.tab(r,c);
end
end
end
的本地副本并直接添加方法。我不能想到这本身有任何巨大的弊端,但感觉这样复杂的内部结构很奇怪。