34.1 クラスの作成
この章では、多項式用に設計されたカスタム クラスを通じて、ユーザー定義クラスとオブジェクト指向プログラミングについて説明します。このクラスは、Octave のプログラミング機能の説明から不必要に気を散らさない単純さのために選択されました。それでも、Octave オブジェクト指向プログラミングの構文とテクニックを紹介する前に、多項式クラスの目的についての背景を少し説明する必要があります。
多項式クラスは、次の形式の多項式を表すために使用されます。
a0 + a1 * x + a2 * x^2 + ... + an * x^n
ここで、a0、a1などは実数スカラーである。したがって、多項式はベクトルで表すことができる。
a = [a0, a1, a2, ..., an];
これは、多項式クラスのコンストラクタを書き始めるのに十分な仕様です。Octave のすべてのオブジェクト指向クラスは、クラス名の先頭に '@' シンボル。たとえば、多項式クラスでは、すべてのメソッドが @多項式ディレクトリ。
クラスのコンストラクタはクラス名そのものでなければなりません。この例では、コンストラクタはファイル内にあります。@多項式/多項式.m理想的には、コンストラクタが引数なしで呼び出された場合でも、有効なオブジェクトを返す必要があります。多項式クラスのコンストラクタは次のようになります。
## -*- texinfo -*-
## @deftypefn {} {} polynomial ()
## @deftypefnx {} {} polynomial (@var{a})
## Create a polynomial object representing the polynomial
##
## @example
## a0 + a1 * x + a2 * x^2 + @dots{} + an * x^n
## @end example
##
## @noindent
## from a vector of coefficients [a0 a1 a2 @dots{} an].
## @end deftypefn
function p = polynomial (a)
if (nargin == 0)
p.poly = 0;
p = class (p, "polynomial");
else
if (isa (a, "polynomial"))
p = a;
elseif (isreal (a) && isvector (a))
p.poly = a(:).'; # force row vector
p = class (p, "polynomial");
else
error ("@polynomial: A must be a real vector");
endif
endif
endfunction
コンストラクタの戻り値は class関数の出力でなければならないことに注意してください。関数の最初の引数はclass構造体で、2番目はクラス自体の名前です。クラスコンストラクタを呼び出してインスタンスを作成する例は次のとおりです。
p = polynomial ([1, 0, 1]);
メソッドはクラス ディレクトリ内の m ファイルによって定義され、他の m ファイルと同様にドキュメントを埋め込むことができます。コンストラクタのヘルプはコンストラクタ名だけを使用して取得できます。つまり、多項式コンストラクタの場合はhelp polynomialヘルプ文字列が返されます。ヘルプは、クラス ディレクトリ名の後にメソッドを続けて使用することで、特定のクラスに限定できます。たとえば、はhelp @polynomial/polynomial多項式コンストラクタのヘルプ文字列を表示する別の方法です。この 2 番目の方法は、クラスのオーバーロードされたメソッドと関数のヘルプを取得する唯一の方法です。
Octave が関数名を期待する場所であればどこでも、同じ指定メカニズムを使用できます。たとえば、多項式クラスのメソッドtype @polynomial/dispのコードを disp画面に出力し、 多項式クラスのメソッドdbstop @polynomial/dispの最初の実行可能行にブレークポイントを設定しますdisp。
変数がユーザー クラスに属しているかどうかを確認するには、関数isobjectと isa関数を使用できます。例:
p = polynomial ([1, 0, 1]); isobject (p) ⇒ 1 isa (p, "polynomial") ⇒ 1
: tf = isobject (x)
xがクラス オブジェクトの 場合は true を返します。
See also: class, typeinfo, isa, ismethod, isprop.
methods関数を使用すると、クラスの使用可能なメソッドを表示できます 。
: methods (obj)
: methods ("classname")
: methods (…, "-full")
: mtds = methods (…)
オブジェクトobjまたは名前付きクラスclassnameのパブリック メソッドの名前を一覧表示します。
obj はOctave クラス オブジェクトまたは Java オブジェクトです。classname はOctave クラスまたは Java クラスの名前です。
オプションの引数"-full"が指定された場合、Octave は出力タイプ、メソッド名、および入力の数とタイプを含む完全なメソッド シグネチャを返します。
出力引数なしで呼び出されると、methodsメソッド名のリストが画面に出力されます。それ以外の場合、出力引数mtds に は文字列のセル配列にリストが含まれます。
See also: ismethod, properties, fieldnames.
To inquire whether a particular method exists for a user class, the ismethod function can be used.
: tf = ismethod (obj, method)
: tf = ismethod (class_name, method)
文字列メソッドがオブジェクト objまたはクラスclsnameの有効なメソッドである場合は true を返します。
See also: isprop, isobject, isjava, methods.
多項式クラスの場合、その根を計算するメソッドを持つことは理にかなっています。
function r = roots (p) r = roots (fliplr (p.poly)); endfunction
次のように呼び出すことで、 roots-methodの存在を確認できます。
p = polynomial ([1, 0, 1]); ismethod (p, "roots") ⇒ 1