objected-oriented programmingが(classdef
-styleとobsolete @-directoryスタイルクラスの両方を含む)MATLABで導入された前に、1 couldは(当然の継承を欠く)閉鎖やネストされた関数を使用して軽量のオブジェクトを作成します。この概念は他の言語でも存在します。ここで
は一例です:
として使用されている
function s = mystruct()
s = struct('value_1',[], 'value_2',2, 'sum',@mysum);
s.value_1 = 3;
function out = mysum()
out = s.value_1 + s.value_2;
end
end
:クロージャを作成するときに、変数をすぐに捕獲されていることを
>> s = mystruct()
s =
value_1: 3
value_2: 2
sum: @mystruct/mysum
>> s.value_1 = 10; % NOTE: this wont do what you expect!
>> s.sum()
ans =
5
注意(あなたがするかどうかの関数は、独自のプライベート・コピーを持っています)。したがって、公開されたフィールドの1つを返された構造体から変更した場合、それは囲まれた状態に反映されません(読み込み専用のプロパティとみなされます)。
一つの解決策は、アクセサメソッドを提供することである。
function obj = mystruct()
% think of those as private properties
value_1 = 3;
value_2 = 2;
% returned object (this or self)
obj = struct();
% public accessors for properties
obj.value_1 = @accessValue1;
function out = accessValue1(in)
if nargin > 0, value_1 = in; end
out = value_1;
end
obj.value_2 = @accessValue2;
function out = accessValue2(in)
if nargin > 0, value_2 = in; end
out = value_2;
end
% member method
obj.sum = @mysum;
function out = mysum()
out = value_1 + value_2;
end
end
だから今、私たちは言うことができる:
クラスを作成するには、現在推奨されるアプローチのように見え始めている
>> s = mystruct()
s =
value_1: @mystruct/accessValue1
value_2: @mystruct/accessValue1
sum: @mystruct/mysum
>> x = s.value_1(); % get
>> s.value_1(10); % set
>> s.sum()
ans =
12
:
classdef mystruct < handle
properties
value_1 = 3;
value_2 = 2;
end
methods
function out = sum(obj)
out = obj.value_1 + obj.value_2;
end
end
end
同様の方法で使用されます。
>> s = mystruct()
s =
mystruct with properties:
value_1: 3
value_2: 2
>> s.value_1 = 10;
>> s.sum
ans =
12
我々はまた、/以前のようにaccess methodsセットされますを定義することができます。..
するのではなく、このために構造体よりもクラスを使用するべきではないでしょうか。 – Dan
迅速な対応とコメントをありがとう。今、私は、MATLABでクラスを定義する方法があることを認識しています。 – radarhead