クラス階層からのオブジェクトの保存と読み込み
サブクラス オブジェクトの保存と読み込み
オブジェクトの最も特定的なクラスで loadobj
メソッドまたは saveobj
メソッドが定義されない場合、このクラスはスーパークラスから loadobj
メソッドまたは saveobj
メソッドを継承できます。
階層内のいずれかのクラスで saveobj
または loadobj
メソッドが定義されている場合は、以下を行います。
階層内のすべてのクラスに対して
saveobj
を定義します。スーパークラスの
saveobj
メソッドをサブクラスのsaveobj
メソッドから呼び出します。これは、関数save
が最も特定的なsaveobj
メソッドだけを呼び出すからです。サブクラスの
loadobj
メソッドは、それらのプロパティに値を割り当てるためにスーパークラスのloadobj
、あるいは必要に応じてその他のメソッドを呼び出すことができます。
保存された struct
からのサブクラス オブジェクトの再生成
サブクラス オブジェクトのプロパティ データをクラスの saveobj
メソッドで struct
にまず変換することで、このサブクラス オブジェクト保存することを考えます。次に、オブジェクトが読み込まれる際に、その loadobj
メソッドを使用してこれを再構成します。この動作には、以下が必要です。
スーパークラスは、
struct
それらのプロパティ データを保存するためにsaveobj
メソッドを実装します。サブクラスの
saveobj
メソッドは、各スーパークラスのsaveobj
メソッドを呼び出し、完成したstruct
を関数save
に返します。次に、関数save
はstruct
を MAT ファイルに書き込みます。サブクラスの
loadobj
メソッドはサブクラスのオブジェクトを作成し、スーパークラスのメソッドを呼び出してそのプロパティ値をサブクラス オブジェクトに代入します。サブクラスの
loadobj
メソッドは、関数load
に再作成されたオブジェクトを返し、これはオブジェクトをワークスペースに読み込みます。
次のスーパークラス (MySuper
) とサブクラス (MySub
) の定義で、これらのメソッドのコードを記述する方法を示します。
MySuper
クラスは、このクラスのオブジェクトが直接読み込まれるように、loadobj
メソッドを定義します。サブクラスの
loadobj
メソッドは、サブクラス オブジェクトを作成した後でreload
というメソッドを呼び出します。reload
は、まずスーパークラスのreload
メソッドを呼び出してスーパークラスのプロパティ値を代入し、次にサブクラスのプロパティ値を代入します。
classdef MySuper properties X Y end methods function S = saveobj(obj) S.PointX = obj.X; S.PointY = obj.Y; end function obj = reload(obj,S) obj.X = S.PointX; obj.Y = S.PointY; end end methods (Static) function obj = loadobj(S) if isstruct(s) obj = MySuper; obj = reload(obj,S); end end end end
サブクラスの saveobj
および loadobj
メソッドから、スーパークラスの saveobj
および loadobj
メソッドを呼び出します。
classdef MySub < MySuper properties Z end methods function S = saveobj(obj) S = saveobj@MySuper(obj); S.PointZ = obj.Z; end function obj = reload(obj,S) obj = reload@MySuper(obj,S); obj.Z = S.PointZ; end end methods (Static) function obj = loadobj(S) if isstruct(s) obj = MySub; obj = reload(obj,S); end end end end