すべての制約を考えると、あなたが望むとおりに正確に機能するものはないと思います。
ただし、表記の問題についてはよくわかりません。w.A
変更しないと考えられているのに、なぜ表記を保持したいのvalue
ですか?記法w.A
を似たものにすることは、実際の問題ではありません。
いくつかの変更されたコードを使用して、次の実行を生成できます。
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A
15
>> value = w.Aref;
>> value()
15
>> w.A = 20;
>> value()
ans =
20
value()
しかし、それは実装のターニングポイントであるため、表記法を回避する方法はありません。これは、あなたが望むものに最も近いものだと思います。次のコードを使用して実装すると、上記の動作が得られますmyClass
。
classdef myClass < handle
properties
A = 1;
end
methods
function obj = myClass(val)
obj.A = val;
end
function a = Aref(obj)
a = @()(obj.A);
end
end
end
Aref
メソッドが実際に、オブジェクトから値を取得する関数ハンドルを返すことがわかります。これは、この参照が読み取り専用であることも意味します。
またmyClass
、値を取得する前にインスタンスをインスタンス化する必要があることに注意してくださいA
(A
そうでなければ、どこから値を取得しますか?)。myClass インスタンスは関数ハンドル内に格納されるため、このインスタンスは現在のワークスペース (別の関数スコープなど) 内に表示される必要はありませんvalue
。
このメソッドの欠点は、読み取り専用の参照しか取得できないことです。呼び出しを使用してvalue()
、関数ハンドルの代わりに実際の値を取得する必要があります (そのため、表記は変更されますが、保持したいものは変更されません)。少なくともA
、私のコードを に置き換えて名前をAval
変更Aref
することで、そうすることができますA
. もう1つの欠点はvalue
、単に変数を解決するよりも解決が少し遅くなる可能性があることですvalue()
.
表記の一部を変更したい場合は、従属プロパティを使用して行うことができます。
classdef myClass < handle
properties (Access=private)
Aval = 1;
end
properties (Dependent)
A;
end
methods
function obj = myClass(val)
obj.A = val;
end
function a = get.A(obj)
a = @()(obj.Aval);
end
function set.A(obj,value)
obj.Aval = value;
end
end
end
上記の同等の実行は、次のように与えられます。
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A()
15
>> value = w.A;
>> value()
15
>> w.A = 20;
>> value()
ans =
20
編集:これを実装する別の方法を考えました。これはより簡単です(つまり、元の投稿のクラスを保持するだけです)が、他の場所でコードを変更する必要があります。その背後にある基本的な考え方は最初のものと同じですが、オブジェクト自体にカプセル化することはありません (これにより、オブジェクトがよりクリーンになります)。
>> q = myClass(10);
>> q.A = 15;
>> w = q;
>> w.A()
15
>> value = @()(w.A);
>> value()
15
>> w.A = 20;
>> value()
ans =
20