最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

単純なクラスの作成

クラスの設計

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

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

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

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

以下は 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

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

multiplyBy(a,3)
ans =

    3.1416

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

a.multiplyBy(3)

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

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

コンストラクターの追加

クラスでは、コンストラクターと呼ばれる、クラスのオブジェクトを作成するための特別なメソッドを定義できます。コンストラクター メソッドでは、コンストラクターに引数を渡して、プロパティ値として代入することができます。BasicClass Value プロパティは関数 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);

その場合、次の式

[obj.Value] + 2

は、次の式と等価です。

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

roundOff メソッドはベクトル化されているため、配列を処理できます。

roundOff(obj)
ans =

    2.8000    0.8700    7.0000

関数のオーバーロード

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

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

method
   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

関連するトピック