【问题标题】:What is the purpose of non-static methods in MATLAB?MATLAB 中非静态方法的目的是什么?
【发布时间】:2012-03-07 11:10:43
【问题描述】:

自从 MATLAB does not provide self-reference 以来,MATLAB 中的静态方法和非静态方法之间的实际区别是什么,除了后者在没有类实例的情况下无法调用?无论如何,总是必须传递对要修改的对象的引用(edit 除了 setter、getter 和 overloaded operators 隐含包含自引用)

【问题讨论】:

  • 有趣的评论。我能想到的唯一区别是你的类继承handle

标签: oop matlab static


【解决方案1】:

对于非静态方法,Matlab 提供调用类作为第一个参数。按照(个人约定)我将此参数称为self,然后它会模拟自引用语法。例如:

methods (Static = false)
    function output = someMethod(self, arg1, arg2, arg3)
        self.x      %Now refers to the (potentially private) field `x`
        self.someOtherFunction(arg1, arg2) %Calls another method, which may be static or not.
    end
end

对比

methods (Static = true)
    function output = someStaticMethod(arg1, arg2, arg3)
        %There is no input appropriate to the name "self" 
        someOtherFunction(arg1, arg2) %Calls another method, which must be static
    end
end

给定一个对象someObject,这些方法都可以通过以下方式调用:

someObject.someMethod(arg1, arg2, arg3)
someObject.someStaticMethod(arg1, arg2, arg3)

链接问题中讨论的自我引用是指包名,这是一种完全不同的动物。

【讨论】:

  • 啊,我理解错了,所以 MATLAB 确实 有某种this 对象,只是它在方法定义中明确命名(但没有 i> 传入函数调用)。谢谢!现在这确实有意义
  • 它可以在函数调用中传递,这取决于你是使用对象还是函数语法来调用它。使用@Pursuit 的示例,您可以键入“someObject.someMethod(arg1, arg2, arg3)' 或 someMethod(someObject, arg1, arg1, arg3)'。两者通常是等价的,这种等价性可能说明了 MATLAB 方法签名为何如此。
  • 那些调用形式通常是等价的,但它们不一样的情况可能解释了为什么没有隐含的this。如果您使用无点 someMethod(someObject, arg1, arg2) 语法,则方法调度对象不必是第一个参数。你可以打电话给someMethod(arg1, arg2, someObject)。调用的方法取决于所有参数的运行时类型,以及它们的优劣关系。像这样的多重分派,不一定有一个方法分派对象可以用于隐式this
【解决方案2】:

也许更相关的是可以在不调用对象构造函数的情况下调用静态方法:即,如果类 foo 具有静态方法 bar,则 foo.bar() 调用静态方法 bar 而不会调用构造函数 foo()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 2010-11-13
    • 1970-01-01
    • 2020-04-11
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    相关资源
    最近更新 更多