Main Content

クラス階層からのオブジェクトの保存と読み込み

サブクラス オブジェクトの保存と読み込み

オブジェクトの最も特定的なクラスで loadobj メソッドまたは saveobj メソッドが定義されない場合、このクラスはスーパークラスから loadobj メソッドまたは saveobj メソッドを継承できます。

階層内のいずれかのクラスで saveobj または loadobj メソッドが定義されている場合は、以下を行います。

  • 階層内のすべてのクラスに対して saveobj を定義します。

  • スーパークラスの saveobj メソッドをサブクラスの saveobj メソッドから呼び出します。これは、関数 save が最も特定的な saveobj メソッドだけを呼び出すからです。

  • サブクラスの loadobj メソッドは、それらのプロパティに値を割り当てるためにスーパークラスの loadobj、あるいは必要に応じてその他のメソッドを呼び出すことができます。

保存された struct からのサブクラス オブジェクトの再生成

サブクラス オブジェクトのプロパティ データをクラスの saveobj メソッドで struct にまず変換することで、このサブクラス オブジェクト保存することを考えます。次に、オブジェクトが読み込まれる際に、その loadobj メソッドを使用してこれを再構成します。この動作には、以下が必要です。

  • スーパークラスは、struct それらのプロパティ データを保存するために saveobj メソッドを実装します。

  • サブクラスの saveobj メソッドは、各スーパークラスの saveobj メソッドを呼び出し、完成した struct を関数 save に返します。次に、関数 savestruct を MAT ファイルに書き込みます。

  • サブクラスの loadobj メソッドはサブクラスのオブジェクトを作成し、スーパークラスのメソッドを呼び出してそのプロパティ値をサブクラス オブジェクトに代入します。

  • サブクラスの loadobj メソッドは、関数 load に再作成されたオブジェクトを返します。関数 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

関連するトピック