2009年5月31日日曜日

D言語の名前空間

-
 D言語は名前空間がややこしいです。

 D言語はファイル名"~/~/filename.extension"のfilenameの部分(パスと拡張子を除いた部分)がモジュール名となります。
 別ファイルのソースを参照したい場合、このモジュール名をインポートすることで参照できます。例を示します。

"main.d"
import point;

void main()
{
Point p;
}

"point.d"
public class Point
{
public int X;
public int Y;
}

 これで、"main.d"内で"point.d"内のクラスが使えます。モジュール名は全て小文字が基本です。そのため、ファイル名も全て小文字になります。

モジュール名がファイル名に依存することは、あまり好ましくありません。そのため、ソースコード内でモジュール名を決める方法があります。

"point.d"
module point;

public class Point
{
public int X;
public int Y;
}


 さて、本番はここからです。オブジェクト指向では一つのクラスに一つのファイルというのは基本的な考え方です。
 では、ファイルごとにモジュール名が決まるこの方法では、数個の関連したクラスを一つ一つインポートしなければならないという問題が生じます。

 それを回避する方法は、おそらく次のような方法です。
 まず、一まとめにするクラスを用意します。例では"point.d"と"rect.d"です。

"point.d"
module point;

public class Point
{
public int X;
public int Y;
}

"rect.d"
module rect;

public class Rect
{
public int Top;
public int Left;
public int Width;
public int Height;
}

 次に、それらのクラスをインポートするだけのファイルを用意します。public importを用いれば、ファイルをまたがってインポートできます。

"draw.d"
module draw;

/*四角形を表すクラス*/
public import rect;
/*位置を表すクラス*/
public import point;

 こうすれば、drawをインポートするだけでRectとPointが使えるようになります。

"main.d"
import draw;

void main()
{
Point p;
Rect r;
}

0 件のコメント:

コメントを投稿