2015-04-23 83 views
2

我已經定義了一個簡單的類名爲MySettings,它的內部保存在一個類中定義的其他設置稱爲MySubSettings意外的初始屬性值

%% --- Definition for MySubSettings 
classdef MySubSettings < handle  
    properties 
     Fifi = 666;   
    end  
end 

%% --- Definition for MySettings 
classdef MySettings < handle  
    properties 
     Riri = 42; 
     Subs = MySubSettings(); 
    end 
end 

我第一次實例MySettingss = MySettings();一切正常(物業Riri被初始化爲42SubsMySubSettings與初始化爲666財產Fifi一個實例)......到目前爲止好...

現在,如果我修改屬性值並重新分配給s新的實例是這樣的:

s.Riri = 0; 
s.Subs.Fifi = 0; 
s = MySettings(); 

然後檢查新值,在新s實例屬性...我有s.Riri等於42(預期) ...但s.Subs.Fifi仍然等於0,我本來期望它被重新初始化爲666(???)

爲什麼只有Riri初始化?我做錯了什麼或者它是一個錯誤?

注:我有R2013b和R2014b的問題。

+0

歡迎MATLAB OOP :) – gregswiss

回答

3

我的誤會......在類定義爲屬性指定

值不初始值(像在C#爲例)但默認值,不再重新評估後級第一次使用。

在我的例子,作爲MySubSettings是一個手柄類,分配給它的任何值將成爲下一個實例新的默認。

This 默認值概念有點令人困惑......但好的,這是我的錯誤......對不起。

+2

的精彩世界,這是正確的。爲了獲得您期望的行爲,請在mySettings的構造函數中爲MySubSettings分配初始值,而不是默認屬性值。對於這個設計MATLAB OO的批評,見@Yair的[最近的一篇文章(http://undocumentedmatlab.com/blog/handle-object-as-default-class-property-value)在他的博客UndocumentedMATLAB和爲了保護它,請參閱我和Dave Foti發表的文章的評論。 –

+0

@SamRoberts感謝這些澄清,我確實想知道爲什麼要有這樣的「默認值」概念,而不僅僅是「每個實例的初始化」。 – CitizenInsane