|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 06 名前空間
株式会社ピーデー
川俣 晶
2004/04/29 |
|
|
名前空間の機能は便利だが、名前空間を含む名前をいちいち記述していると、全体的にソース・コードが長くなってしまう。同じ名前のクラスが出現する頻度はさして高いものではなく、それ以外の状況ではできるだけソースを短く書きたいと考えることは、当然の成り行きといえる。これに対応するために、VB.NETにはImportsステートメントが存在する。Importsステートメントは、名前空間名を省略したときのデフォルト名前空間名を指定するために使用することができる。例えば、名前空間名を省略したときに、Sample003n.MySpace1であると指定したサンプル・プログラムがリスト6-6である。
1: Imports Sample003n.MySpace1
2:
3: Namespace MySpace1
4: Public Class MyClass1
5: Public Shared Sub MyMethod1()
6: Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
7: End Sub
8: End Class
9: End Namespace
10:
11: Namespace MySpace2
12: Public Class MyClass1
13: Public Shared Sub MyMethod1()
14: Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
15: End Sub
16: End Class
17: End Namespace
18:
19: Public Class Form1
20: Inherits System.Windows.Forms.Form
21:
22: …Windows フォーム デザイナで生成されたコード…
23:
24: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
25: MyClass1.MyMethod1()
26: MySpace2.MyClass1.MyMethod1()
27: End Sub
28: End Class
|
|
リスト6-6 デフォルト名前空間名を指定するためにImportsステートメントを使用したプログラム
|
これを実行すると以下のようになる。
1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
|
|
リスト6-7 リスト6-6の実行結果
|
25行目では、名前空間名の指定を省略して、いきなりMyClass1というクラス名を記述している。このソースには、MyClass1というクラスが2つあるが、コンパイラは混乱することはない。なぜなら、1行目のImportsステートメントにより、省略時のデフォルト名前空間名がSample003n.MySpace1であると指示されているからだ。そのため、25行目のMyClass1は名前空間Sample003n.MySpace1(つまり、Namespace MySpace1で宣言された名前空間)であることが明確なのである。一方、もう1つの名前空間に属するMyClass1を利用するには、26行目のように、名前空間名を明示した長い書き方を必要とする。
Importsステートメントは、1つに限らずいくつ書いてもよい。つまり、デフォルトの名前空間名は、いくつでも持つことができる。クラス名の重複など、そうめったに起こることではないので、複数のデフォルトの名前空間名を指定しても、通常は問題は起こらない。もし、名前の重複が起きた場合だけ、名前空間名を含むフルネームで記述するようにすれば、問題はない。
ちなみに、実際に利用する場合は、1つのソースに全部収まっているわけではなく、いくつものソースに分かれていることが多いだろう。例えば、以下のような感じである。
まず、クラスの定義となるソース・コード。
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
|
|
リスト6-8 リスト6-6のクラス定義部分を1つのソースにしたプログラム(プロジェクト名は「Sample004n」とする)
|
次にクラスの利用を記述したソース・コード。
1: Imports Sample004n.MySpace1
2:
3: Public Class Form1
4: Inherits System.Windows.Forms.Form
5:
6: …Windows フォーム デザイナで生成されたコード…
7:
8: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
9: MyClass1.MyMethod1()
10: MySpace2.MyClass1.MyMethod1()
11: End Sub
12: End Class
|
|
リスト6-9 リスト6-8を利用するプログラム
|
Importsステートメントに関しては、Instancingプロパティの変更、別名を定義するImportsステートメント、ピリオドで区切られた名前とImportsステートメントも参照してほしい。
Importsステートメントには、デフォルトの名前空間名を指定する機能のほかに、名前空間名やクラス名の別名を定義する機能がある。例えばリスト6-10は、Sample005n.MySpace1という名前空間名を「a」という名前で指定可能にし、Sample005n.MySpace2.MyClass1というクラス名を「b」という名前で指定可能にして利用した例である。
1: Imports a = Sample005n.MySpace1
2: Imports b = Sample005n.MySpace2.MyClass1
3:
4: Namespace MySpace1
5: Public Class MyClass1
6: Public Shared Sub MyMethod1()
7: Trace.WriteLine("MySpace1.MyClass1.MyMethod1 called")
8: End Sub
9: End Class
10: End Namespace
11:
12: Namespace MySpace2
13: Public Class MyClass1
14: Public Shared Sub MyMethod1()
15: Trace.WriteLine("MySpace2.MyClass1.MyMethod1 called")
16: End Sub
17: End Class
18: End Namespace
19:
20: Public Class Form1
21: Inherits System.Windows.Forms.Form
22:
23: …Windows フォーム デザイナで生成されたコード…
24:
25: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
26: a.MyClass1.MyMethod1()
27: b.MyMethod1()
28: End Sub
29: End Class
|
|
リスト6-10 Importsステートメントにより名前空間名やクラス名の別名を定義したプログラム(プロジェクト名は「Sample005n」とする)
|
これを実行すると以下のようになる。
1: MySpace1.MyClass1.MyMethod1 called
2: MySpace2.MyClass1.MyMethod1 called
|
|
リスト6-11 リスト6-10の実行結果
|
ソースの1〜2行目で、キーワード“a”が名前空間Sample005n.MySpace1であるとし、キーワード“b”がSample005n.MySpace2.MyClass1であると宣言している。そのため、26行目では、
Sample005n.MySpace1.MyClass1.MyMethod1()
と記述する代わりに、
a.MyClass1.MyMethod1()
と記述することで等価な機能を短く記述している。同様に27行目では、
Sample005n.MySpace2.MyClass1.MyMethod1()
と記述する代わりに、
b.MyMethod1()
と短く記述するだけで済んでいる。
この機能は、ソース・コード上のさまざまな部分で利用できる。例えば、クラスを継承する際のInheritsステートメントに指定するクラス名も、この機能で付加した別名でよい(継承については、継承とポリモーフィズムを参照)。リスト6-12は、クラスMyClass1の別名として「a」という名前を宣言したうえで継承を行った例である。
1: Imports a = Sample009n.MyClass1
2:
3: Public Class MyClass1
4: Public Shared Sub MyMethod1()
5: Trace.WriteLine("MyClass1.MyMethod1 called")
6: End Sub
7: End Class
8:
9: Public Class MyClass2
10: Inherits a
11: End Class
12:
13: Public Class Form1
14: Inherits System.Windows.Forms.Form
15:
16: …Windows フォーム デザイナで生成されたコード…
17:
18: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
19: a.MyMethod1()
20: MyClass2.MyMethod1()
21: End Sub
22: End Class
|
|
リスト6-12 Importsステートメントによりクラス名の別名を宣言したプログラム
|
これを実行すると以下のようになる。
1: MyClass1.MyMethod1 called
2: MyClass1.MyMethod1 called
|
|
リスト6-13 リスト6-12の実行結果
|
まず、注目すべき点はソースの10行目である。“Inherits a”と書かれているが、“a”は当然MyClass1(フルネームはSample009n.MyClass1。Sample009nはこのプログラムのプロジェクト名)の別名として機能しており、MyClass2はMyClass1を継承している。そのことは、20行目を見るとはっきりと分かる。MyClass2を通して、MyClass1のメソッドを呼び出すことができている。また、19行目では“a”が完全にMyClass1と等価のキーワードとして機能していることが分かるだろう。
この機能は、普通に記述すると長くなる指定を、短く読みやすくするために使うことができる。特に、同じクラス名などが存在する場合に、適切な別名を用意するために使用すると、読みやすいプログラム・コードを記述できるだろう。
業務アプリInsider 記事ランキング
本日
月間