2017-07-15 87 views
0

常量屬性是Matlab中的靜態屬性(屬於類,而不是實例),就像許多其他OOP語言一樣。和自然的方式來訪問他們是ClassName.PropNameMatlab documentation在Matlab中從超類獲取對象的類

不過,我不能找到一種方法,從超做ClassName.PropName,在這樣的情景:

classdef (Abstract) Superclass < handle 
    properties(Dependent) 
     dependentProperty 
    end 

    properties (Abstract, Constant) 
     constantProperty 
    end 

    methods 
     function result = get.dependentProperty(obj) 
      c = class(obj); % Here I have to get class of obj 
      result = length(c.constantProperty); % to use here as `ClassName.PropName` 
     end 
    end 
end 



classdef Subclass < Superclass 
    properties (Constant) 
     constantProperty = [cellstr('a'); cellstr('b')]; 
    end 
end 

讓下面的輸出此:(預期輸出

以下命令結果
>> subclassInstance = Subclass() 

subclassInstance = 

    Subclass with properties: 

    constantProperty: {2×1 cell} 
    dependentProperty: 2 

>> subclassInstance.dependentProperty 

ans = 

    2 

>> 

但是,相反,我獲得以下這個:(實際輸出

>> subclassInstance = Subclass() 

subclassInstance = 

    Subclass with properties: 

    constantProperty: {2×1 cell} 

>> subclassInstance.dependentProperty 
Struct contents reference from a non-struct array object. 

Error in Superclass/get.dependentProperty (line 13) 
      result = length(c.constantProperty); 

>> 

還嘗試過:c = metaclass(obj)它給出了「沒有適當的方法,屬性或字段'constantProperty' 類'meta.class'。」

問題:有沒有什麼辦法從超類中獲得一個對象的類,能寫出如ClassName.PropName這樣的語句?


編輯:

我知道我可以從對象的引用這樣實現:

function result = get.dependentProperty(obj) 
    result = length(obj.constantProperty); 
end 

但這不是我想要的,因爲它使讀者認爲constantProperty是實例屬性。這也沒有記錄在Matlab中,而是文檔說ClassName.PropName,這讓我覺得必須有一種方法。

回答

2

right在matlab中這樣做的方法是通過實例,根據我以前的答案的一部分,你現在已經在你的問題中納入。這是因爲matlab的面向對象模型是基於「實例」的。

不變屬性的一個實例屬性;它恰好在所有情況下都是相同的(即不變)。據推測,這就是爲什麼它被稱爲「常量」而不是「靜態」的原因:它並不是指內存中的單個靜態項目,如c中;相反,每個實例都使用相同的常量值進行實例化。

你沒有任何出路可以通過「類引用」來調用它(沒有這樣的東西存在btw;不像python和茱莉亞,類原型不是可以引用的對象,也沒有鍵入自己)。

但是,如果你堅持,有正好是一個辦法做到這一點使用元類,因爲不變的性質從構造方法中設置將在其元類配置文件命名爲默認值

subclassInstance = Subclass(); 
m = metaclass(subclassInstance); 
mp = findobj (m.PropertyList, 'Name', 'constantProperty'); 
mp.DefaultValue 

此外,爲了解決爲什麼class(subclassInstance).constantProperty不起作用,這僅僅是因爲class(subclassInstance)結果是字符串(其值恰好是類名),而不是一個「參考」一類(就像我說的,這樣的事情不存在我n matlab)。但是,如果你願意,顯然你可以在eval語句中使用這樣一個類名字符串來評估它,就好像你直接在終端中輸入它來訪問常量屬性一樣。因此,這是實現你追求的另一種方式:

eval([class(subclassInstance) '.constantProperty']) 

但在理論上一般應避免eval語句,除非有沒有其他選擇。


便籤:

在Java中,這是可以通過this.getClass()

在Java中,這被稱爲reflection,它是Java的自己的 '檢查' 的對象機制。當你做類似myObject.getClass()的東西時,你要返回的是仍然不是「引用類的原型」。這是一個實例類型Class。即即使在java中,你也不能這樣做myObject.getClass().aStaticProperty。但你可以使用Class類提供的getFields方法來獲得Field對象,並檢查它們的值相對於特定的對象實例;對於靜態字段,此實例只是成爲null對象。

+0

我知道我可以從物體到達。然而,Matlab文檔告訴我,我可以從類參考。另外,從對象到達是醜陋的,使讀者認爲'constantProperty'是一個實例屬性。另外,在Java中,這可以通過'this.getClass()'來實現,這讓我認爲必須有一種方法。 – ferit

+0

我已經更新了我的答案。希望這有助於更好地解釋事情。 tl; dr:有一種方式,但這不是要走的路。使用這個對象,盧克! –

+1

https://www.mathworks.com/help/matlab/matlab_oop/matlab-vs-other-oo-languages.html表示「不支持靜態屬性。請參閱持久變量。**對於Java靜態final或C++靜態常量屬性,使用常量屬性。**請參閱常量值屬性「。但是'findobj'方法更加醜陋,我最好使用對象引用。 – ferit