【问题标题】:Inheritance in matlabmatlab中的继承
【发布时间】:2016-11-14 13:03:41
【问题描述】:

我在使用 matlab 时遇到了一些问题。我正在使用 b 样条。有时我想使用实际的样条曲线,而其他时候我只想使用所谓的基函数。在不深入研究 b 样条理论的情况下,实际的区别在于,当我想使用 b 样条时,我需要一个额外的方法和属性。我希望通过在构造函数中传递它来初始化这个属性。

到目前为止,我所拥有的(删除了大多数不相关的方法和属性)希望大致展示了我想要的行为:

bsplinespace.m:

classdef bsplinespace < handle
    properties
        p % polynomial degree
    end

    methods
        function result = bsplinespace(p)
            result.p = p;
        end
    end
end

bspline.m:

classdef bspline < bsplinespace
    properties
        controlpoints
    end

    methods
        function result = bspline(p, controlpoints)
            result.controlpoints = controlpoints;
        end
        function result = getp(this)
            result = this.p;
        end
    end
end

但是,在这种情况下,bspline 构造函数调用 bsplinespace 构造函数而不传递任何参数,导致它崩溃:

Not enough input arguments.

Error in bsplinespace (line 8)
            result.p = p;

Error in bspline (line 7)
        function result = bspline(p, controlpoints)

更明确地说,我想要的是:

  • 一个类 bsplinespace,它有一个接受一个参数 p 的构造函数
  • 类bspline,相同,但多了一个属性和方法

有没有优雅的方法来实现这个?

【问题讨论】:

  • 在 bspline 构造函数中为什么不自己调用超类呢? "结果 = 结果@bsplinespace(p)"
  • 我不知道这会导致构造函数不再在没有参数的情况下被调用。这比我的解决方案好,如果你添加这个作为答案,我会接受它!
  • 山姆·罗伯茨的速度似乎更快

标签: matlab oop constructor


【解决方案1】:

bspline 的构造方法中,需要显式调用带有输入参数p 的超类构造函数:

function result = bspline(p, controlpoints)
    result@bsplinespace(p)
    result.controlpoints = controlpoints;
end

否则 MATLAB 将使用零输入参数调用超类构造函数,您将收到您所看到的错误。

这是一个非常明智的设计,并允许您控制子类构造函数的参数如何传递给超类构造函数的细节(或者不传递,如果您想提供默认参数)。

【讨论】:

  • 啊!我认为不带参数调用构造函数是不可避免的,这会很奇怪。这确实更明智,但我仍然觉得它违反直觉。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 2016-04-18
  • 2015-05-24
  • 2013-10-02
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多