Matlab在构造函数中无法更改类的参数

Posted

技术标签:

【中文标题】Matlab在构造函数中无法更改类的参数【英文标题】:Matlab can't change parameters of a class while in constructor 【发布时间】:2020-10-30 15:44:47 【问题描述】:

我正在调用一个函数来更改其构造函数中的类的参数,但是,我无法更改值。这是一个错误还是故意的?

在以下示例中,我在构造函数中调用函数“calculateCalculatedProperties()”。 “calculateCalculatedProperties()”调用“Velocity()”和“Length()”函数来设置速度和长度属性的新值。但是,构造函数(对象实例)的最终产品属性是不变的。

classdef piping
    %PIPING Summary of this class goes here
    %   Detailed explanation goes here
    
    properties 
        flowRate
        diameter
        startLocation location
        endLocation location
    end

    
    
    methods
        function self = piping(flowRate, diameter, startLocation, endLocation)
            
            self.flowRate = flowRate;
            self.diameter = diameter;
            self.startLocation = startLocation;
            self.endLocation = endLocation;
            
            self.calculateCalculatedProperties();
                       
        end
        
        function self = calculateCalculatedProperties(self)
            fprintf("hey")
            self.Velocity();
            self.Length();
        end
        
        
         function self = Velocity(self)
             self.velocity = self.flowRate / (pi * self.diameter^2 / 4);
         end
        
         function self = Length(self)
            self.length = location.calculateDistance(self.startLocation,self.endLocation) ;
            fprintf("hey this is lengthhhh")
            self.flowRate = 10000000;
         end

        
    end
    
    properties % Calculated properties
        
        velocity
        length
    end
end

【问题讨论】:

【参考方案1】:

这里的问题是您使用的是值类,而不是句柄类。请注意,在您的 Velocity 方法中,您将返回一个“self”实例,在值类中,这些方法调用返回一个单独的对象,该对象在此代码中被忽略。

话虽如此,有两种可能的解决方案:

    捕获值对象的输出并返回最终修改的对象。

     function self = piping(flowRate, diameter, startLocation, endLocation)
         % ...
         self = self.calculateCalculatedProperties();      
     end
    
     function self = calculateCalculatedProperties(self)
         fprintf("hey")
         self = self.Velocity();
         self = self.Length();
     end
    

    使用句柄类创建可变对象。

     classdef piping < handle
         % ...
     end
    

请参阅Comparison of Handle and Value Classes 了解更多信息。

【讨论】:

谢谢!现在一切正常!但我还有一个问题,我为什么要保留我的类作为价值类? 这是一个很长的讨论,但简而言之:值类让您以安全、低副作用的“函数式编程”风格进行编程:它们避免了导致共享可变对象引用的“别名”状态和可能的意外副作用,它们允许您以原子的“事务”方式修改对象上的多个字段。另外,大多数 Matlab 的东西都是值而不是处理/引用的东西,所以值对象可以更好地使用它们。我的经验法则是,在 Matlab 中,您应该避免处理类,除非您对它们有特殊需要。 (需要句柄对象的主要原因是该对象是否包装或包含本身就是句柄的东西,例如传递引用的东西,例如Matlab句柄图形句柄,文件句柄,其他Matlab句柄对象、Java 对象引用或其他引用外部共享资源状态的事物,例如文件系统对象或数据库连接。)

以上是关于Matlab在构造函数中无法更改类的参数的主要内容,如果未能解决你的问题,请参考以下文章

在java语言里如何在子类中调用父类的有参构造函数

TheFifthWeekText

Kotlin类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )

在dynamic_pointer_cast之后调用派生类的构造函数

java怎么调用带参数构造函数

Typescript构造函数和继承