允许新的子类继承适用于Matlab

时间:2015-08-21 00:20:27

标签: matlab inheritance

我将用一个例子来说明问题标题的含义。

我想定义一个名为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

2 个答案:

答案 0 :(得分:2)

如果您只需要一个包含关联名称的表格,table已经为您提供了此功能 - 如果a是您的表格,则可以设置a.Properties.Description,并存储名称在那里。您还有a.Properties.UserData,您可以在其中存储任何您喜欢的内容。

关于更一般的问题 - 如何创建从超类继承属性的子类 - 通常,您可以使用classdef MySubClass < MySuperClass完全按照您尝试的方式执行此操作。遗憾的是,这不适用于table,因为MathWorks已将其设为Sealed,这是为了防止您形成能够将其子类化。

这有很好的理由 - 尤其是table具有非标准行为,因为您可以使用点语法以及属性和方法引用变量名称。为了实现这一点,MathWorks需要提供subsrefsubsasgn的非标准实现,如果不依赖于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方法以获得与表格相同的显示。保存/加载可能有类似的含义。