我将用一个例子来说明问题标题的含义。
我想定义一个名为class
的{{1}},它本质上是一个带有名称的表。但是,我希望能够对这个新类的表做我能做的一切。例如,适用于表的任何函数都应该适用于namedTables。或者,我们应该能够使用符号namedTable
访问namedTable列。下面是一个类定义和逻辑示例,我希望namedTable.variableName
继承适用于表的所有函数:
namedTable
我也希望使用类似classdef namedTable
properties
rawTable
name
end
methods
% constructor method
function obj = namedTable(T, name)
obj.rawTable = T;
obj.name = name;
end
% general inheritance of all functions applicable to tables
if fn is any fnction which can be applied to a table:
calculate fn(obj.rawTable)
if this is a table, coerce it to namedTable class by using
obj.name, and return the namedTable created.
else
output fn(obj.rawTable)
end
end
end
end
的内容,但Matlab会返回错误:classdef namedTable < table
答案 0 :(得分:2)
如果您只需要一个包含关联名称的表格,table
已经为您提供了此功能 - 如果a
是您的表格,则可以设置a.Properties.Description
,并存储名称在那里。您还有a.Properties.UserData
,您可以在其中存储任何您喜欢的内容。
关于更一般的问题 - 如何创建从超类继承属性的子类 - 通常,您可以使用classdef MySubClass < MySuperClass
完全按照您尝试的方式执行此操作。遗憾的是,这不适用于table
,因为MathWorks已将其设为Sealed
,这是为了防止您形成能够将其子类化。
这有很好的理由 - 尤其是table
具有非标准行为,因为您可以使用点语法以及属性和方法引用变量名称。为了实现这一点,MathWorks需要提供subsref
和subsasgn
的非标准实现,如果不依赖于table
的内部,实现它的子类将非常困难。
如果你需要类似的东西,那么你可以使用composition rather than inheritance,虽然在这种情况下这可能有点工作。基本上,您将table
存储为您的类的属性,然后对于您希望访问的基础table
的任何功能,您将在您的超类中实现相应的方法,并传递调用通过
答案 1 :(得分:1)
这样做只是为了添加一个名字并不是一个好主意。获得表的所有功能并不容易。要获得表的大部分功能,您需要覆盖subsref方法。例如subsref你可以使用
function [varargout] = subsref(obj, S)
if strcmp(S.type, '.') && strcmp(S.subs, 'name')
varargout{1} = obj.name;
else
[varargout{1:nargout}] = subsref(obj.pTable, S);
end
end
同样,您还需要实施subsasgn
。您仍然没有表格的方法和属性的标签完成。您还需要覆盖disp
方法以获得与表格相同的显示。保存/加载可能有类似的含义。