2015-01-07 106 views
3

我很難決定什麼是在MATLAB中使用構造函數的最佳方法。 大多數提供的例子如下:MATLAB構造函數

classdef ClassA < handle 
    properties 
     m_a; 
     m_b; 
    end 

    methods 
     function obj = ClassA(a,b) 
      obj.m_a = a; 
      obj.m_b = b;   
    end 
end 

但是假設a和b是其他類ClassB的和ClassC

接着的構造也可被寫爲:

methods 
    function obj = ClassA(a,b) 
     obj.m_a = ClassB(a); 
     obj.m_b = ClassC(b);   
end 

哪種方式是首選的慣例?

回答

0

在這種情況下沒有優選的慣例。儘管它們看起來很相似,但你的兩個例子並不完全相同。這將全部取決於如何將ab呈現給classA的構造函數。

在你第一種情況: ab必須分別classBclassC當他們被送到classA

在你的第二個案例: ab沒有的classB/C情況下,只是需要的classB/C構造函數的參數的典型實例化對象。假設他們屬於double類,這是爲了爭辯。

所以

 case 1:     case 2: 
variable | type   variable | type 
    a  classB    a  double 
    b  classC    b  double 

then in classA 
obj.m_a classB   obj.m_a classB 
obj.m_b classC   obj.m_b classC 

正如你所看到的,它使得在年底classA差別不大。選擇應該更多地由調用函數(將調用classA的構造函數的函數)必須處理。

  • 如果在調用函數make使用abclassB類和classC的對象,那麼它是有意義的通話功能,有這些已經上市,然後發送到classA構造函數時,它調用它。在這種情況下,你會選擇你的第一個選項。

  • 如果調用函數只能自認倒黴classBclassC做(這些類是隻爲內部或有用classA),那麼就沒有必要在調用函數來處理這種類型。保持ab儘可能的簡單,只需在第二個例子中在classA的構造器中實例化classBclassC


作爲一個側面說明,要注意的handle classes的一些細節。具體Matlab的doc說:

初始化屬性重複值 MATLAB分配屬性指定的默認值,只有當MATLAB加載類 定義一次。因此,如果使用句柄類構造函數初始化屬性值,則MATLAB只調用該構造函數一次,而每個實例引用相同的句柄對象。如果您希望每次創建對象時都將 屬性值初始化爲句柄對象 的新實例,請在 構造函數中分配屬性值。

這意味着,如果您選擇選項2,classB/C也處理類,它不要求輸入參數,DO NOT嘗試快捷方式,並宣佈他們是這樣的:

classdef ClassA < handle 
    properties 
     m_a = ClassB() ; %// never do that if ClassB is a handle class 
     m_b = classC() ; %// never do that if ClassC is a handle class 
    end 
methods 
    function obj = ClassA(a,b) 
     %// do you other stuff 
end 

相反,在構造函數中初始化變量(如您在示例中所做的那樣),而不是在屬性定義中。我知道這不是你所做的,但如果你選擇了你的選項2,那麼很容易陷入這個陷入困境的想法中來簡化事情。 如果您要這樣做,則不會顯示任何錯誤,但您可以在以後的代碼中聲明/創建的任何其他實例始終會引用與您的屬性定義中第一次創建的非常相同的對象。 (classA即使其他情況下將有它們的屬性都引用相同的唯一classB對象。