2017-07-15 13 views
0

定数プロパティは、他の多くのOOP言語と同様に、Matlabの静的プロパティ(インスタンスではなくクラスに属します)です。そしてそれらにアクセスする自然な方法はMatlab documentationのようにClassName.PropNameです。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 

>> 

しかし、代わりに、私はこの:(実際の出力

を以下の取得します0
>> 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)「 クラス 'meta.class'に対して、適切なメソッド、プロパティ、またはフィールド 'constantProperty'がありません。

質問:ClassName.PropNameのような文を書くには、スーパークラスからオブジェクトのクラスを取得する方法はありますか?


EDIT:

私はこのようなオブジェクト参照から到達することができます知っている:

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

しかし、それはconstantPropertyはインスタンスプロパティだと思うし、読者になり、これは私が欲しいものではありません。これはMatlabには書かれていませんが、ドキュメントにはClassName.PropNameと書かれていますが、これは方法が必要であると私に思います。

答えて

2

matlabでこれを行う方法は、私の前の答えの一部として、今あなたの質問に組み込まれているインスタンスを介してです。これは、matlabのオブジェクト指向モデルが "インスタンス"に基づいているためです。

定数プロパティは、のインスタンスプロパティです。すべての場合において、同じ(すなわち、一定)であることだけが起こる。おそらく、これは「静的」ではなく「定数」と呼ばれる理由です。これはcのようなメモリ内の単一の静的な項目を指すわけではありません。代わりに、すべてのインスタンスが同じ定数値でインスタンス化されます。

"クラス参照"を介して呼び出す方法はありません(そのようなものは存在しません; pythonやjuliaとは異なり、クラスプロトタイプは参照できないオブジェクトでもなく、自分自身をタイプする)。あなたが主張する場合は、コンストラクタ内から設定された一定のプロパティがメタクラスプロファイルで指定されたデフォルト値を持つことになりますので、

しかし、は、この使用してメタクラスを行う方法があるように起こるん

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でJavaで

これはthis.getClass(によって可能である)

このreflectionと呼ばれ、それが '検査' オブジェクトのためのJavaの独自のメカニズムですさ。 myObject.getClass()のようなことをすると、返すのはで、まだであり、 "クラスのプロトタイプへの参照"ではありません。これは、のインスタンスです。私。 javaでも、myObject.getClass().aStaticPropertyを実行することはできません。しかし、あなたはFieldオブジェクトを取得するためにClassクラスによって提供されるgetFieldsメソッドを使用し、特定のオブジェクトインスタンスに関してその値を検査します。静的フィールドの場合、このインスタンスは単に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 static finalまたはC++静的constプロパティ、定数プロパティを使用する。**定数値を持つプロパティを参照してください。しかし、はい 'findobj'メソッドは、より醜い方法です、私はオブジェクト参照を使用することをお勧めします。 – ferit

関連する問題