Matlab OOP - getter 方法可以有参数吗?

Posted

技术标签:

【中文标题】Matlab OOP - getter 方法可以有参数吗?【英文标题】:Matlab OOP - Can getter methods have arguments? 【发布时间】:2015-04-06 11:54:38 【问题描述】:

我正在做一个 matlab OOP 项目,我需要一个带有一个参数的 getter 方法。由于我不想使问题非常具体,所以我想概括一下。所以这里是上下文:

我有一个 2D 空间对象 (SpaceObject),其中包含以下字段:X_Pos、Y_Pos 和 Movement_Model。 X_Pos 和 Y_Pos 描述了空间对象在 XY 平面中的位置。 Movement_Model 是描述空间对象在 XY 平面中运动的对象。该字段初始化为空 [],因此可以定义或取消定义。 当未定义 Movement_Model 字段对象时,约定是 X_Pos 和 Y_Pos 是时间不变的。获取这些属性是通过编写 pos = space_obj.X_Pos 隐式完成的 定义 Movement_Model 字段对象时,约定是 X_Pos 和 Y_Pos 成为时间变量。但是这一次,getter 方法需要时间值/值与 Movement_Model 字段对象一起计算任何时刻在空间中的位置。所以我想要这样的东西: pos = space_obj.X_Pospos = space_obj.X_Pos(1)pos = space_obj.X_Pos([1: 1:10]) 但 Matlab getter 不能有其他参数。 一种解决方案是将时间变量设置在空间对象内部,但我有严格的设计限制,要让所有对象外部的时间变量。 另一个解决方案是使用一个函数而不是一个名为 Get_X_Pos 的 getter,但我希望与其他静态对象保持一致(对于这些对象,X_Pos 和 Y_Pos 是时间不变的)。我想避免像 space_obj.Get_X_Pos(1) 和 other_obj.X_Pos 这样的混合签名。但这意味着即使不需要,我也需要为所有其他对象编写 Get_X_Pos 函数。

所以这里的问题是由具有外部依赖关系的类属性给出的。所以我的问题是:

为什么 Matlab 不允许 getter 方法使用其他参数?此要求是否与某些 OOP 范例相冲突?为什么? 如何以优雅的方式解决此问题?也许需要重新设计... 无论如何,我的问题可能看起来微不足道,但我正在寻找最佳实践/设计,因为我的项目会随着时间的推移而变得越来越大。任何帮助深表感谢! 谢谢!

【问题讨论】:

【参考方案1】:

带有一个(或多个参数)的getter 方法不再是经典的getter 方法 - 它只是一种普通方法。

使用简单的方法,您可以实现这两个用例:

function x_pos = X_Pos(this, t)
    if nargin < 2
        % handle space_obj.X_Pos case
    else
        % handle space_obj.X_Pos(1) case
    end
end

即使在没有空括号的情况下引用函数,matlab 也会执行函数这一事实,然后您可以将这两种情况结合起来:

x_static = space_obj.X_Pos

x_at_t1 = space_obj.X_Pos(t1)

但是,我个人倾向于将其分成两部分,以明确区分两者。例如。通过使用X0_Pos 或类似属性的“静态”版本和X_Pos 作为时间相关的版本。在这种情况下,您可以例如使用依赖属性为static_obj.X0_Pos 返回static_obj.X_Pos(0)

function x0_pos = X0_Pos(this)
    x0_pos = this.X_Pos(0);
end

【讨论】:

但是有一个问题:如果有一个名为 X_Pos 的属性,你就不能有一个同名的方法!我质疑当你编写 obj.X_Pos 时,班级无法分辨出你查询的是哪一个。感谢您的宝贵时间! 嗯,当然可以。我不建议使用方法和属性——而是使用方法而不是属性。由于调用无参数方法在语法上与访问属性相同,因此不会造成任何伤害。

以上是关于Matlab OOP - getter 方法可以有参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB:OOP 调用不同类的函数

为啥返回一个迭代器低耦合(OOP)?

在哪里定义类型转换到 MATLAB OOP 中的结构?

基本的matlab类方法[重复]

Matlab 类方法:参数太多

Matlab 中的类和 switch 语句