【问题标题】:Default get method that returns specific property - MATLAB返回特定属性的默认 get 方法 - MATLAB
【发布时间】:2020-04-01 09:50:46
【问题描述】:

我正在重构一些 MATLAB 遗留软件,这些软件涉及在广泛的测试中获得的数据。我正在尝试创建一个包含每个单独频道的数据以及一些额外信息(例如其物理单位)的类。

只是为了把这个问题放在这里,这个类可能是这样的:

classdef Channel < handle
    properties (Access = 'private')
        prvValue, prvUnits;
    end

    properties (Dependent)
        value, units;
    end

    methods
        function this = Channel(value, units)
            this.value = value;
            this.units = units;
        end

        function set.value(this, value)
            this.prvValue = value;
        end

        function out = get.value(this)
            out = this.prvValue;
        end

        function set.units(this, units)
            this.prvUnits = units;
        end

        function out = get.units(this)
            out = this.prvUnits;
        end                  
    end
end

您可以使用以下内容创建此类的对象:

> ch1 = Channel([1:10], 'm');

并通过以下方式访问其依赖属性:

>> ch1.value

ans =

     1     2     3     4     5     6     7     8     9    10

>> ch1.units

ans =

    'm'

这仍然需要将访问数据的旧代码中的每一行从“ch1”更改为“ch1.value”。

现在我的问题是:有没有办法定义一种返回类的特定属性(在本例中为“值”)的“默认获取方法”?换句话说,行为如下:

>> ch1

ans =

     1     2     3     4     5     6     7     8     9    10

>> ch1.units

ans =

    'm'

欢迎任何帮助。非常感谢。

【问题讨论】:

    标签: matlab class methods get


    【解决方案1】:

    不,ch1 本身就是对象。如果您自己键入ch1(通过重载display 方法),您可以让MATLAB 输出“ans = 1 2 3 ...”,但这实际上不会将该值分配给ans。特别是你不能改变foo = ch1的结果,foo永远是对象本身。

    另一方面,您可以重载double 方法,使foo = double(ch1) 产生与foo = ch1.value 相同的结果。


    请注意

    我正在重构一些 MATLAB 遗留软件 [...]

    自动导致

    这仍然需要更改旧代码中的每一行 [...]

    重构代码涉及大量重写。如果您不想更改太多代码,请减少重构的侵入性。不要将普通数组更改为复杂对象。

    【讨论】:

    • 感谢您的回复,克里斯。不必改变很多其他的东西只是我提出问题的一个原因,但我可以忍受。实际上还有其他涉及其他人的原因,为什么我想保留与访问标准数组相同的语法来访问数据。我非常同意你所有的cmets。不幸的是,这些替代方案并没有完成我想要做的事情。
    • @Guillermo:你可以收集人们使用这个数组的所有方式,看看你是否可以重载足够多的方法来使行为相似。不能重载的一件事是赋值 foo = ch1foo 将与 ch1 相同,而不仅仅是一个普通数组。但是您可以重载ch1(index)max(ch1) 以及用户对ch1 应用的任何其他函数,以确保行为一致。正如我所说,您可以重载对象在输出中的显示方式。
    • 重载显示方法不是解决办法。它甚至没有在软件中使用,我只是用它来描述我在 OP 中的问题。请看看我自己的回复,如果您发现有任何问题,请告诉我。
    【解决方案2】:

    与此同时,我发现了一些似乎 - 到目前为止 - 完全符合我的目标:使新类继承自 MATLAB 的标准双类:

    classdef ChannelDouble < double
        properties
            units
        end
    
        methods
            function this = ChannelDouble(data, units)            
                this = this@double(data);
                this.units = units;            
            end
        end  
    end
    

    这个类返回:

     >> ch1 = ChannelDouble([1:10], 'm')
    
    ch1 = 
    
      1×10 ChannelDouble array with properties:
    
        units: 'm'
    
      double data:
         1     2     3     4     5     6     7     8     9    10
    
    >> ch1.^2  % <--- Standard notation returns the data just like a double array would do
    
    ans =
    
         1     4     9    16    25    36    49    64    81   100
    
    >> ch1.units
    
    ans =
    
        'm'
    

    如果有人能想到更好的解决方案,请告诉我。否则我会在这里留下这个回复,以防它可以帮助任何有类似问题的人。

    【讨论】:

    • 这真的很有趣!
    • 请注意句柄类和非句柄类(即普通类)之间的区别。在 Q 你有一个句柄类。行为明显不同,您需要记住对普通类执行ch1 = ch1.setSomeValue(0) 之类的操作。 IMO,句柄类不应该用于数据,只能用于封装了一些资源的对象(如图形对象、文件等),因为它们不遵循标准的 MATLAB 值传递概念。
    • ch2 = ch1.^2ch2 中返回双精度值?那真不幸。我将不得不尝试这个想法。感谢发帖!
    • 我知道这一点并将记住您的评论,尽管我目前没有看到任何问题。我想我从来没有在 MATLAB 中实现过非句柄类。我什至在 MATLAB 中尝试之前就了解了 C++ 中的类是什么,所以我想句柄类对我来说只是自然的方式。这并不妨碍按值返回 get 方法的输出,就像在 MATLAB 中通常一样,并且正如任何其他操作所期望的那样。
    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多