34.2 Class Methods

Last-modified: 2025-03-08 (土) 20:05:54

34.2 クラスメソッド

クラスの内容を照会および設定できるように定義できる (また定義すべき) 基本的なクラス メソッドがいくつかあります。これらのメソッドの中で最も基本的なメソッドはdispメソッドです。dispクラスを画面に表示する必要がある場合はいつでも、メソッドが Octave によって使用されます。通常、これはセミコロンで終わらない Octave 式の結果です。このメソッドが定義されていない場合、クラスの内容を表示するときに Octave は何も印刷しないため、混乱が生じる可能性があります。

disp多項式クラスのメソッド の例は次のようになります。

function disp (p)
 a = p.poly;
 first = true;
 for i = 1 : length (a);
   if (a(i) != 0)
     if (first)
       first = false;
     elseif (a(i) > 0 || isnan (a(i)))
       printf (" +");
     endif
     if (a(i) < 0)
       printf (" -");
     endif
     if (i == 1)
       printf (" %.5g", abs (a(i)));
     elseif (abs (a(i)) != 1)
       printf (" %.5g *", abs (a(i)));
     endif
     if (i > 1)
       printf (" X");
     endif
     if (i > 2)
       printf (" ^ %d", i - 1);
     endif
   endif
 endfor
 if (first)
   printf (" 0");
 endif
 printf ("\n");
endfunction

Octave グラフィック ハンドル クラスとの一貫性を保つために、クラスでは メソッドgetとsetメソッドも定義する必要があります。getメソッドは 1 つまたは 2 つの引数を受け入れます。 最初の引数は、適切なクラスのオブジェクトです。 2 番目の引数が指定されていない場合、メソッドはクラスのすべてのプロパティを含む構造体を返す必要があります。 オプションの 2 番目の引数が指定されている場合、それはプロパティ名である必要があり、指定されたプロパティが取得されます。

function val = get (p, prop)
 if (nargin < 1)
   print_usage ();
 endif
 if (nargin == 1)
   val.poly = p.poly;
 else
   if (! ischar (prop))
     error ("@polynomial/get: PROPERTY must be a string");
   endif
   switch (prop)
     case "poly"
       val = p.poly;
     otherwise
       error ('@polynomial/get: invalid PROPERTY "%s"', prop);
   endswitch
 endif
endfunction

同様に、メソッドの最初の引数はsetオブジェクトであり、追加の引数はプロパティと値のペアである必要があります。

function pout = set (p, varargin)
 if (numel (varargin) < 2 || rem (numel (varargin), 2) != 0)
   error ("@polynomial/set: expecting PROPERTY/VALUE pairs");
 endif
 pout = p;
 while (numel (varargin) > 1)
   prop = varargin{1};
   val  = varargin{2};
   varargin(1:2) = [];
   if (! ischar (prop) || ! strcmp (prop, "poly"))
     error ("@polynomial/set: invalid PROPERTY for polynomial class");
   elseif (! (isreal (val) && isvector (val)))
     error ("@polynomial/set: VALUE must be a real vector");
   endif
   pout.poly = val(:).';  # force row vector
 endwhile
endfunction

Octave は参照渡しを実装していないことに注意してください。したがって、オブジェクトを変更するには、 setメソッドからの戻り値を使用する代入ステートメントが必要です。

p = set (p, "poly", [1, 0, 0, 0, 1]);

メソッドはクラスの メソッドsetを使用するため、このメソッドも定義する必要があります。メソッドについては、次のセクションで詳しく説明します (オブジェクトのインデックス作成を参照)。 subsasgnsubsasgn

最後に、ユーザー クラスは構造体の特殊なタイプと見なすことができ、構造体と同じ方法でファイルに保存できます。例:

p = polynomial ([1, 0, 1]);
save userclass.mat p
clear p
load userclass.mat

saveおよびでサポートされているすべてのファイル形式loadがサポートされています。状況によっては、ユーザー クラスに保存しても意味がないフィールドや、保存する前に初期化する必要があるフィールドが含まれる場合があります。これは、saveobjクラスの メソッドを使用して実行できます。

: b = saveobj (a)
オブジェクトをファイルに保存する前に操作するクラスのメソッド。

関数はsaveobj、オブジェクトa が関数を使用して保存されるときに呼び出されますsave。 の使用例としてはsaveobj 、保存する意味のないオブジェクトのフィールドを削除することや、オブジェクトが保存される前にオブジェクトの特定のフィールドが初期化されるようにすることなどが挙げられます。例:

function b = saveobj (a)
 b = a;
 if (isempty (b.field))
    b.field = initfield (b);
 endif
endfunction

See also: loadobj, class.

saveobjクラスをファイルに保存する直前に呼び出されます。同様に、このloadobjメソッドはクラスがファイルからロードされた直後に呼び出され、削除されたフィールドがユーザー オブジェクトに再挿入されることを保証するために使用できます。

: b = loadobj (a)
ファイルからオブジェクトを読み込んだ後にそのオブジェクトを操作するクラスのメソッド。

関数は、関数を使用してloadobjオブジェクトaがロードされたときに呼び出されますload。 の使用例としては、saveobj 保存する意味のないフィールドをオブジェクトに追加することが挙げられます。例:

function b = loadobj (a)
 b = a;
 b.addmissingfield = addfield (b);
endfunction

See also: saveobj, class.