Main Content

単純なクラスの作成

クラスの設計

クラスの基本的な目的は、データとそのデータで実行される操作をカプセル化するオブジェクトを定義することです。たとえば、BasicClass は 1 つのプロパティと、そのプロパティに含まれるデータに対し実行される 2 つのメソッドを定義します。

  • Value — クラスのオブジェクトに保存された数値データを含むプロパティ

  • roundOff — プロパティの値を小数点以下 2 桁に丸めるメソッド

  • multiplyBy — プロパティの値を指定された数値で乗算するメソッド

classdef ClassName...end ブロックを使用してクラス定義を開始してから、そのブロック内でクラス プロパティとメソッドを定義します。以下は BasicClass の定義です。

classdef BasicClass
   properties
      Value {mustBeNumeric}
   end
   methods
      function r = roundOff(obj)
         r = round([obj.Value],2);
      end
      function r = multiplyBy(obj,n)
         r = [obj.Value]*n;
      end
   end
end

クラスの構文の概要は、classdef を参照してください。

クラスを使用するには、次の手順に従います。

  • クラス定義を、クラスと同じ名前の .m ファイルに保存します。

  • クラスのオブジェクトを作成します。

  • プロパティにアクセスしてデータを代入します。

  • メソッドを呼び出してデータに対し演算を行います。

オブジェクトの作成

クラス名を使用してクラスのオブジェクトを作成します。

a = BasicClass
a = 

  BasicClass with properties:

    Value: []

最初、プロパティ値は空です。

プロパティへのアクセス

オブジェクト変数とドットをプロパティ名の前に付けて、Value プロパティに値を代入します。

a.Value = pi/3;

プロパティ値を返すには、代入項なしでドット表記を使用します。

a.Value
ans =

    1.0472

クラス プロパティの詳細については、プロパティ構文を参照してください。

メソッドの呼び出し

roundOff メソッドを a オブジェクトに対して呼び出します。

roundOff(a)
ans =

    1.0500

次に示す multiplyBy メソッドの呼び出しのように、複数の引数を取るメソッドには、オブジェクトを 1 番目の引数として渡します。

multiplyBy(a,3)
ans =

    3.1416

また、ドット表記を使用してメソッドを呼び出すこともできます。

a.multiplyBy(3)

ドット表記を使用する場合、オブジェクトを明示的に引数として渡す必要はありません。表記は、ドットの左のオブジェクトを使用します。

クラス メソッドの詳細については、メソッドの構文を参照してください。

コンストラクターの追加

クラスでは、コンストラクターと呼ばれる、クラスのオブジェクトを作成するための特別なメソッドを定義できます。コンストラクター メソッドでは、コンストラクターに引数を渡して、プロパティ値として代入することができます。BasicClassValue プロパティは、関数 mustBeNumeric を使用して、可能な値を制限します。

以下は BasicClass クラスのコンストラクターです。入力引数を指定してコンストラクターを呼び出すと、Value プロパティに代入されます。入力引数を指定せずにコンストラクターを呼び出すと、Value プロパティの既定値は空 ([]) になります。

methods        
    function obj = BasicClass(val)
        if nargin == 1
            obj.Value = val;
        end
    end
end

このコンストラクターをクラス定義に追加して、以下のように 1 ステップでオブジェクトを作成してプロパティ値を設定できます。

a = BasicClass(pi/3)
a = 

  BasicClass with properties:

    Value: 1.0472

コンストラクターは、クラスのオブジェクト作成に関連するその他の操作を実行できます。

コンストラクターの詳細については、クラス コンストラクター メソッドを参照してください。

メソッドのベクトル化

MATLAB® では演算をベクトル化することができます。たとえば、ベクトルに数値を加算できます。

[1 2 3] + 2
ans =

     3     4     5

MATLAB は数値 2 を配列 [1 2 3] の各要素に加算します。算術演算子メソッドをベクトル化するには、obj.Value プロパティ参照を大かっこで囲みます。

[obj.Value] + 2

この構文により、メソッドがオブジェクトの配列を操作できるようになります。たとえば、インデックス付き代入を使用してオブジェクト配列を作成します。

obj(1) = BasicClass(2.7984);
obj(2) = BasicClass(sin(pi/3));
obj(3) = BasicClass(7);

次の 2 つの式は同じものになります。

[obj.Value] + 2
[obj(1).Value obj(2).Value obj(3).Value] + 2

プロパティ参照が大かっこで囲まれているため、roundOff メソッドはベクトル化されます。

r = round([obj.Value],2);
roundOff はベクトル化されているため、配列を処理できます。

roundOff(obj)
ans =

    2.8000    0.8700    7.0000

関数のオーバーロード

クラスでは、既存の MATLAB 関数と同じ名前でメソッドを定義することにより、加算などの既存の機能を実装できます。たとえば、2 つの BasicClass オブジェクトを加算するとします。各オブジェクトの Value プロパティの値を加算するのが理に適っています。

次に示すのは、MATLAB の関数 plus のオーバーロードされたバージョンです。BasicClass クラスの加算をプロパティ値の加算として定義します。

methods
   function r = plus(o1,o2)
      r = [o1.Value] + [o2.Value];
   end
end

plus というメソッドを実装することにより、BasicClass のオブジェクトに "+" 演算子を使用できるようになります。

a = BasicClass(pi/3);
b = BasicClass(pi/4);
a + b
ans =

    1.8326

plus メソッドをベクトル化することにより、オブジェクト配列を処理できます。

a = BasicClass(pi/3);
b = BasicClass(pi/4);
c = BasicClass(pi/2);
ar = [a b];
ar + c
ans =

    2.6180    2.3562

関連情報

関数のオーバーロードについての詳細は、クラス定義での関数のオーバーロードを参照してください。

演算子のオーバーロードについての詳細は、演算子のオーバーロードを参照してください。

BasicClass のコード リスト

以下は、このトピックで取り上げた機能を追加した後の BasicClass の定義です。

classdef BasicClass
    properties
        Value {mustBeNumeric}
    end
    methods
        function obj = BasicClass(val)
            if nargin == 1
                obj.Value = val;
            end
        end
        function r = roundOff(obj)
            r = round([obj.Value],2);
        end
        function r = multiplyBy(obj,n)
            r = [obj.Value] * n;
        end
        function r = plus(o1,o2)
            r = [o1.Value] + [o2.Value];
        end
    end
end

関連するトピック