2015-04-06 67 views
1

我正在开发一个matlab OOP项目,我需要一个带有一个参数的getter方法。既然我不想让这个问题非常具体,我想概括一下。所以这里的上下文: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的干将不能有其他参数。
  • 一个解决方案是将时间变量作为空间对象的内部空间,但是我有强大的设计约束让时间变量在所有对象的外部。
  • 另一种解决方案是使用函数而不是名为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

A 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) 

但是我个人更喜欢把它分成两部分m明确区分两者。例如。通过使用X0_Pos或类似的属性的“静态”版本和X_Pos作为时间依赖的一个。在这种情况下,你可以例如使用依赖属性返回static_obj.X_Pos(0)static_obj.X0_Pos

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

但有一个问题:如果有一个属性命名X_POS你不能使用该名称的方法!当你写obj.X_Pos时,我不知道你要查询哪一个。谢谢你的时间! – 2015-04-08 07:46:15

+0

嗯,当然是。我并不是建议使用方法和属性 - 而是一种方法而不是属性。由于调用无参数方法在语法上与访问属性相同,因此不会造成任何损害。 – sebastian 2015-04-08 07:53:25