|
|
連載
改訂版 プロフェッショナルVB.NETプログラミング
Chapter 06 名前空間
株式会社ピーデー
川俣 晶
2004/04/29 |
|
名前空間は、クラスなどが所属する世界を分ける機能である。例えば、たくさんの既存のクラスを集めて活用する場合、その中には、たまたま同じ名前を持つクラスなどが存在している場合がある。しかし、名前空間の機能を活用すれば、同じ名前のクラスも別の名前空間に属しているとして、同時に活用することができる。クラス・ライブラリ活用には必須の機能といえるので、機能をしっかりと把握しておくとよいだろう。
プログラムの開発中に、既存のソース・コードを取り込んで利用できることに気付くのは珍しくない。しかし、単純に既存のソース・コードを、開発中のソース・コードに取り込めばすぐ使えるものとは限らない。例えば、重要なクラスやメソッドの名前が重複していて、そのままではコンパイル・エラーになってしまうことが起こりえる。このような状況に対処するために、VB 6にはPrivateキーワードなどの機能が備わっている。Privateキーワードは、メソッドなどの有効範囲を特定のモジュール内に限定することで、別モジュールに同名のメソッドがあってもトラブルを起こさないようにすることができる。この機能はVB.NETにも含まれているが、もし、モジュール内に限定することができない、つまり、Publicであるべきキーワードが対象であるなら、この方法では逃げられない。このような状況でも有効に対処できる機能として、VB.NETには名前空間という機能が存在している。
名前空間は、クラスなどのプログラミング要素を入れる入れ物である。名前空間はいくつでも定義することができ、名前空間が異なっていれば、同じ名前のクラスなどを作成することができる。名前空間自身も名前を持っていて、名前空間の名前も明示すれば、同じ名前のクラスを使い分けることができる。リスト6-1は、実際に同じ名前のMyClass1というクラスが2個存在するソース・コードである。
1: Namespace MySpace1
2: Public Class MyClass1
3: Public Shared Sub MyMethod1()
4: Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
5: End Sub
6: End Class
7: End Namespace
8:
9: Namespace MySpace2
10: Public Class MyClass1
11: Public Shared Sub MyMethod1()
12: Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
13: End Sub
14: End Class
15: End Namespace
16:
17: Public Class Form1
18: Inherits System.Windows.Forms.Form
19:
20: …Windows フォーム デザイナで生成されたコード…
21:
22: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
23: MySpace1.MyClass1.MyMethod1()
24: MySpace2.MyClass1.MyMethod1()
25: End Sub
26: End Class
|
|
リスト6-1 同名の2つのクラスが存在するプログラム
|
これを実行すると以下のようになる。
1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
|
|
リスト6-2 リスト6-1の実行結果
|
このソース・コードには、2〜6行目と、10〜14行目に、MyClass1という名前のクラスの定義が記述されている。普通ならこのような内容を記述するとコンパイル・エラーになるのだが、このソースはエラーにならない。その理由は、1〜7行目と、9〜15行目のNamespace宣言にある。1〜7行目のNamespace宣言は、この範囲がMySpace1という名前空間に属していることを指定している。9〜15行目のNamespace宣言は、この範囲がMySpace2という名前空間に属していることを指定している。異なる名前空間に属していれば、同名のクラスが存在してもよいので、このソース・コードはエラーを起こさない。
次に注目すべきことは、これらのクラスを参照する方法である。ソース23〜24行目では、実際にこの2つのクラスに属するメソッドを呼び出している。通常、クラスMyClass1の共有メソッドMyMethod1を呼び出すなら、MyClass1.MyMethod1()と記述するだけでよいところだが、この場合、名前空間名も先頭に付加して、MySpace1.MyClass1.MyMethod1()あるいは、MySpace2.MyClass1.MyMethod1()と記述している。
このようなテクニックは、クラス・ライブラリで多用されている。例えば、テキスト入力の機能を持つTextBoxクラスは、.NET Frameworkのクラス・ライブラリ内に2つ存在している。1つは、System.Web.UI.WebControls名前空間に属している。もう1つは、System.Windows.Forms名前空間に属している。これらはそれぞれWebアプリケーションとWindowsアプリケーションで使われるもので、役割は同じだがまったく異なる機能を持ったクラスである。この2つのクラスは、異なる名前空間に存在するため、仮に同時に利用するように指定したとしても混乱することはない。逆に、Webアプリケーションを作成するときも、Windowsアプリケーションを作成するときも、テキスト入力を行うユーザーインターフェイスを提供するクラスは、TextBoxという名前で扱うことができ、便利である。
リスト6-1では、“Namespace MySpace1”というように名前空間を宣言していたため、MySpace1が名前空間名であるかのように思えるもしれない。だが、これは真の名前空間名というわけではない。そのことは、Visual Studio .NETのオブジェクトブラウザ経由で見ればすぐに分かる。
|
●図6-3 Visual Studio .NETのクラス・ブラウザで見た名前空間 |
見てのとおり、MySpace1という名前空間名はなく、その代わりにSample001n.MySpace1という名前空間名が存在する。同様にMySpace2ではなく、Sample001n.MySpace2である。「Sample001n」はプロジェクト名である。つまり、暗黙のうちに「プロジェクト名+ピリオド」が、Namespace宣言で宣言した名前の先頭に付加されていることになる。また、一見、名前空間名を何も指定していないかのように見えたForm1クラスも、プロジェクト名の名前空間の下に存在することが読み取れるだろう。
では、もし真の名前空間名をソース・コード中で指定したら何が起こるだろうか。実際に記述してみたソース・コードがリスト6-4である。
1: Namespace MySpace1
2: Public Class MyClass1
3: Public Shared Sub MyMethod1()
4: Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
5: End Sub
6: End Class
7: End Namespace
8:
9: Namespace MySpace2
10: Public Class MyClass1
11: Public Shared Sub MyMethod1()
12: Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
13: End Sub
14: End Class
15: End Namespace
16:
17: Public Class Form1
18: Inherits System.Windows.Forms.Form
19:
20: …Windows フォーム デザイナで生成されたコード…
21:
22: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
23: Sample002n.MySpace1.MyClass1.MyMethod1()
24: Sample002n.MySpace2.MyClass1.MyMethod1()
25: End Sub
26: End Class
|
|
リスト6-4 真の名前空間名でメソッドを呼び出すプログラム
|
これを実行すると以下のようになる。
1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
|
|
リスト6-5 リスト6-4の実行結果
|
ソースの23〜24行目に、真の名前空間名を記述してみた。ここで「Sample002n」とは、このサンプル・プログラムのプロジェクト名である。このソースはまったく問題なく動作する。こういう呼び出し方もあることを頭に入れておくとよいだろう。
業務アプリInsider 記事ランキング
本日
月間