D言語/オブジェクト指向

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

クラスは複数の変数を一まとめにし、それらを扱う関数も内包することで、簡潔で他のプログラムに依存しない独立した処理を可能とします。また、クラスは雛形(ひながた)であり、同じ性質を持ったデータ(オブジェクト)を多数作る事ができます。

実体化[編集]

クラスは雛形に過ぎないため、実際に変数として使うためには定義、宣言した後に実体化(インスタンス化)という作業が必要になります。Cというクラスのオブジェクトc1は

C c1;    // 宣言
c1 = new C();

で実体化できます。これ以降c1をC型の変数として扱う事ができます。newが実体化する命令で、その対象はCというクラス、という事です。空白の()は後述するコンストラクタに何も指定しない事を意味します。

メンバ変数[編集]

classの中に定義された変数の事を特にメンバ変数と言います。 オブジェクトの持つデータそのもので、これを扱いやすくするための仕組みが以下になります。

メンバ関数(メソッド)[編集]

classの中に定義された関数を特にメンバ関数、メソッドと言います。 メンバ変数に対する決まりきった処理を他のオブジェクトに依存すると、関わるオブジェクト数が増えるため複雑で読みにくく直しにくいコードになります。メンバ変数の事はメンバ関数に任せましょう。

コンストラクタ[編集]

this()という名前を持つ特殊なメンバ関数です。クラスをオブジェクトとして実体化する際に、this関数の中で定義された初期化処理を実行します。引数なしの場合はメンバ変数のデフォルト値を与えるのに使います。初期化するだけなので、返り値はありません。

this()
{
    i = 0;
    str = "Default string";
}

引数ありの場合も定義でき、何個でも定義できます(オーバーライド)

this(int x)
{
    i = x;
    str = "int override";
}
this(string strin)
{
    i = 0;
    str = strin;
}

ここで定義した関数は、new実行時にC(引数)と表記する事で、引数に応じてthis(引数)関数を実行します。様々な初期状態を持った同じクラスのオブジェクトを作るのに便利です。

演算子オーバーロード[編集]

四則演算(+-*/)など多くの演算記号を、クラスに対してまるごと作用させる演算を定義できます。

インターフェース[編集]

インターフェースというものによってメソッドの実装を強制することができます。

interface Bell {
    void ring(int sec);
}

class AlarmClock : Bell {
    void ring(int sec) {
        import std.stdio: writeln;
        while(sec > 0) {
            writeln("Good Morning!");
            --sec;
        }
    } 
}

void main(){   
    auto my_clock = new AlarmClock();
    my_clock.ring(10);

}
実行結果
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
Good Morning!
解説

インターフェースはクラスの持つべきメソッドのリストであり、そのインターフェースを継承したらすべてのメソッドを実装しなければならない。つまり、インターフェースは、それらのメソッドを持つ型の定義なのである。

備考

インターフェース内のメソッドにin-out契約を指定することもできる[1]

  1. ^ Interfaces - D Programming Language 2020年7月20日に閲覧して確認