在這種情況下沒有優選的慣例。儘管它們看起來很相似,但你的兩個例子並不完全相同。這將全部取決於如何將a
和b
呈現給classA
的構造函數。
在你第一種情況: a
和b
必須分別classB
和classC
當他們被送到classA
。
在你的第二個案例: a
和b
沒有的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使用a
和b
爲classB
類和classC
的對象,那麼它是有意義的通話功能,有這些已經上市,然後發送到classA
構造函數時,它調用它。在這種情況下,你會選擇你的第一個選項。
如果調用函數只能自認倒黴classB
和classC
做(這些類是隻爲內部或有用classA
),那麼就沒有必要在調用函數來處理這種類型。保持a
和b
儘可能的簡單,只需在第二個例子中在classA
的構造器中實例化classB
和classC
。
作爲一個側面說明,要注意的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
對象。)