Column - 高度なアクセス制御 -
ここで説明することは内容的にやや高度なので、後で読んでもらってもかまわない。
メソッドなどを宣言する際に、publicやprivateといったアクセス範囲を指定するキーワードを付けることができるが、これと同じ仲間に、internalとprotectedというキーワードがある。internalは、そのプログラムの内部からのみ参照できることを指定するキーワードである。クラス・ライブラリなどを作成する場合は、クラス・ライブラリ自身を含むDLL(Dynamic Link Library。通常は拡張子.DLLのファイル)と、それを呼び出す実行ファイル(通常は拡張子.EXEのファイル)を作成することになるが、クラス・ライブラリ内部でinternalキーワードを付けたメソッドは、クラス・ライブラリ内部からは呼び出せるが、実行ファイルからは呼び出せないことになる。protectedは、継承したクラスから呼び出すことを許すが、それ以外のクラスからは呼び出せないことを指定する。両者は同時に指定することができるが、その際は、同じプログラム内と継承されたクラス内から呼び出し可能という意味になる。以下は実際に使用してみた例である。最初はクラス・ライブラリの例である。
1: using System;
2:
3: namespace Sample003DLL
4: {
5: public class Class2
6: {
7: internal void sample1()
8: {
9: }
10: protected void sample2()
11: {
12: }
13: protected internal void sample3()
14: {
15: }
16: }
17: public class Class1 : Sample003DLL.Class2
18: {
19: void sample()
20: {
21: Class1 instance = new Class1();
22: instance.sample1();
23: instance.sample2();
24: instance.sample3();
25: }
26: }
27: }
以下はクラス・ライブラリを呼び出す実行ファイルの例である。
1: using System;
2:
3: namespace Sample003EXE
4: {
5: class Class1 : Sample003DLL.Class2
6: {
7: [STAThread]
8: static void Main(string[] args)
9: {
10: Class1 instance = new Class1();
11: instance.sample1(); // 'Sample003DLL.Class2.sample1()' はアクセスできない保護レベルになっています。
12: instance.sample2();
13: instance.sample3();
14: }
15: }
16: }
このソースをビルドすると、11行目で「'Sample003DLL.Class2.sample1()' はアクセスできない保護レベルになっています。」というエラーになる。まったく同じ記述がクラス・ライブラリ内にあるが、これはエラーになっていない。この差がinternalキーワードの効力である。
それに対して、実行ファイル内のクラスであっても、クラス・ライブラリ内のクラスを継承していれば、protectedなメソッドを呼び出すことができる。「protected internal」なメソッドは2つの条件のうちどちらか一方が満たされればアクセス可能である。この場合、internalの条件は満たさないが、protectedの条件は満たすので、呼び出し可能である。
Column - コンポーネントとコントロール -
C#の世界には、クラス(Class)のほかにもコンポーネント(Component)、コントロール(Control )という言葉がある。それぞれ、プログラムを構成する部品としての役割を持つものだが、意味が少し異なる。これらは、どういう意味の違いを持っているのだろうか? なお、ここでは後述の章で解説する用語も使用しているので、先を一読後に読まれるとよいだろう。
C#において、クラスは、いうまでもなくclassキーワードで宣言するものである。これに関しては迷うことはないだろう。では、コンポーネントとは何を意味する言葉だろうか? 一般用語としては、再利用され、ほかのオブジェクトとインタラクトするオブジェクトということになるが、C#では(より正確には.NET Frameworkでは)、System.ComponentModel.IComponentインターフェースを直接または間接的に実装したクラスということになる。このインターフェースは、サイトに関する機能を実装するために使用される。サイトとは、コンポーネントと、その入れ物となるコンテナの関係を表現するために使用される機能である。コンテナはSystem.ComponentModel.IContainerインターフェースを実装したクラス、サイトはSystem.ComponentModel.ISiteインターフェースを実装したクラスとなる。
では、Visual Basicプログラマーならおなじみのコントロールはどのような意味を持っているのだろうか? 言葉の意味としては、ユーザーインターフェースを持ったコンポーネントがコントロールということになる。.NET Frameworkには、2種類のコントロールが存在する。1つは、クライアント側のWindows Formsで使用されるもので、System.Windows.Forms.Controlを直接または間接的に継承したクラスがこれにあたる。もう1つは、サーバー側のASP.NETで使用されるもので、System.Web.UI.Controlを直接または間接的に継承したクラスがこれにあたる。すべてのコントロールはコンポーネントでもあるが、すべてのコンポーネントがコントロールというわけではない。
このようにクラス、コンポーネント、コントロールは、それぞれ異なる役割を与えられた有益なものである。うまく使いこなして、効率よくプログラムを作成しよう。
『新プログラミング環境 C#がわかる+使える』
本記事は、(株)技術評論社が発行する書籍『新プログラミング環境 C#がわかる+使える』から許可を得て一部分を転載したものです。
【本連載と書籍の関係について 】
この書籍は、本フォーラムで連載した「C#入門」を大幅に加筆修正し、発行されたものです。連載時はベータ版のVS.NETをベースとしていましたが、書籍ではVS.NET製品版を使ってプログラムの検証などが実施されています。技術評論社、および著者である川俣晶氏のご好意により、書籍の内容を本フォーラムの連載記事として掲載させていただけることになりました。
→技術評論社の解説ページ
ご注文はこちらから
Copyright© Digital Advantage Corp. All Rights Reserved.