第 2 回:Visual C# によるオブジェクト指向入門~ Visual C# による .NET Framework プログラミング入門 ~2.1 はじめにVisual C# は、Microsoft 社の .NET 戦略上で重要な位置を占める言語であり、Web アプリケーション開発をはじめとする様々なアプリケーション開発の現場でその高い開発効率とハイパフォーマンスを実現してくれます。特に、.NET Framework のコントロールやクラスは、部品を組み立てる感覚で利用できるため、プログラムの開発効率を大きく向上させ、堅牢なプログラムを開発できることが大きな特徴です。これらの特徴は、オブジェクト指向プログラミングの思想が深く関係しています。そのため、本章の前半では、オブジェクト指向プログラミングの概念について説明し、後半では、Visual C# に用意された便利なオブジェクト指向プログラミングの機能の利用方法を紹介していきます。 2.2 オブジェクト指向とは2.2.1 オブジェクトとはオブジェクトとは,プログラムを構築するうえで,特定の役割をはたす部品のことです。 Visual C# では、フォーム、コントロールなどの様々なオブジェクトを組み合わせてプログラムを作成します。また、1つのオブジェクトは、メソッド (振る舞い) とプロパティ (属性) をインタフェースとして備えています。メソッドとプロパティについては、 第 2.2.4 項を参照してください。オブジェクトの構成例を図 1 に示します。 .gif)
図 1 オブジェクトの構成例 2.2.2 オブジェクト指向の特徴/利点オブジェクト指向プログラミングの特徴は、オブジェクトを再利用しやすい形式で、開発することです。オブジェクト指向プログラミングでは、データと手続きを一つのオブジェクトとしてまとめ、一つの機能をオブジェクト単位で開発します。つまり、オブジェクトは個々が独立しています。この独立したオブジェクト同士は、メッセージを介してやり取りをします。個々のオブジェクトが独立していることにより、一つのオブジェクトという部品を組み合わせることで簡単にプログラムの仕様を変更できます。オブジェクト指向プログラミングでは、プログラムの一部を変更した場合でも、他の部分へ影響しないという利点があります。またオブジェクトの再利用による開発コストの削減が最大の利点です。オブジェクト指向プログラミングのイメージを図 2 に示します。 .gif)
図 2 オブジェクト指向プログラミングのイメージ 2.2.3 クラスとインスタンスクラスとは、オブジェクトがどのようなものであるかを記述した設計図であり、オブジェクトの型のことです。インスタンスとは、設計図 (クラス) から生成された実体のことです。 クラスとインスタンスの関係について、ロボットを例に解説します。ロボットクラスは、ロボットの設計図を表します。ロボットクラスには、そのロボットの実装が記述されています。ロボットの設計図であるロボットクラスを利用することにより、複数のロボットを作成することができます。この作成された個々のロボットがインスタンスを表します。クラスとインスタンスの関係を図 3 に示します。 .gif)
図 3 クラスとインスタンスの関係 2.2.4 メソッドとプロパティオブジェクトは、メソッドとプロパティというインタフェースを持っています。ユーザや外部オブジェクトは、メソッドとプロパティを介して、内部データを操作します。つまり、メソッド (振る舞い) やプロパティ (属性) は、ユーザや外部オブジェクトに呼び出されることにより、内部データに作用します。メソッドとプロパティのイメージを図 4 に示します。 .gif)
図 4 メソッドとプロパティのイメージ (1) メソッドメソッドとは、演算などの様々な処理 (振る舞い) を行うためのインタフェースです。例えば、textBox オブジェクトには、テキストボックス内の文字を消去するための clear メソッドが用意されています。 (2) プロパティプロパティとは、オブジェクトが管理しているデータを読み書きするインタフェースのことです。プロパティは、フォームやコントロールなどのオブジェクトが持つ属性を参照・変更するための「データ」のことで、オブジェクトの状態を表します。例えば、textBox オブジェクトには、背景画を参照・変更するための Image プロパティが用意されています。 2.2.5 カプセル化カプセル化とは,オブジェクトの内部データを隠蔽することです。カプセル化を行うことにより,ユーザは,内部的なアルゴリズムやデータの受け渡しを考えることなくオブジェクトを利用することができます。カプセル化のイメージを図 5 に示します。 .gif)
図 5 カプセル化のイメージ 2.2.6 継承継承とは、オブジェクトを再利用する方法の一つです。継承は、インスタンスに対して行うのではなく、クラスに対して行います。オブジェクトを継承することにより、既存のオブジェクトの機能を引き継いで、オブジェクトの機能を拡張することができます。このとき、元のクラスを 「基底クラス」 や 「スーパークラス」、継承して作成されたクラスを「派生クラス」 や 「サブクラス」 と呼びます。例えば、基底のクラスである汎用ロボットクラスと運搬メソッドを新しく追加することにより運搬ロボットクラスを定義することができます。また、汎用ロボットクラスに会話メソッドを新しく追加することにより会話用ロボットクラスなどの拡張されたクラス (派生クラス) を作成することができます。クラス継承のイメージを図 6 に示します。 .gif)
図 6 クラス継承のイメージ 2.3 Visual C# とオブジェクト指向プログラミングここでは、実際にVisual C# のオブジェクト指向言語としての利用方法を紹介します。Visual C# には、オブジェクト指向プログラミングのための機能が実装されており、それらのツールを利用すれば、容易にオブジェクト指向プログラミングを実現することができます。ここで紹介する機能は、1.クラスの定義、2.メソッドの追加、3.プロパティの追加、4.オブジェクトの生成です。本項を読み進めるに当たり、新規に Visual C# のプロジェクトを作成しておいてください。 2.3.1 VC# を利用したオブジェクトプログラミング作成手順(1) クラスの定義クラスを定義するためには、まず初めに、プロジェクト内にどのようなクラスが存在するかを確認する必要があります。プロジェクト内に存在するクラスを表示するには、ソリューションエクスプローラのクラスビューを利用します。クラスビューは、メニューから【表示】→【クラスビュー】を選択することで表示されます。また、ソリューションエクスプローラのクラスビューアイコンをクリックすることでも表示されます。クラスビューの表示方法を図 7 に示します。 .gif)
図 7 クラスビューの表示方法 クラスビューには、プロジェクト内に存在するクラスの一覧とそのメソッドやプロパティなどが表示されます。初期状態では、フォームのクラスである 「Form1」 が表示されます。クラスビューのアイコン一覧を表 1 に示します。 表 1 クラスビューのアイコン一覧 | アイコン | 意味 | .gif) | クラス | .gif) | クラスが実装するメソッド | .gif) | クラスが実装するプロパティ | .gif) | クラスが実装する変数 | .gif) | Privateメンバ |
クラスを新規に作成するには、まずメニューから【プロジェクト】→【クラスの追加】を選択し、【新しい項目の追加】ダイアログを表示します。【新しい項目の追加】ダイアログの表示方法を図 8 に示します。 .gif)
図 8 【新しい項目の追加】ダイアログの表示方法 次に、テンプレートペインから【クラス】を選択し、【名前】でファイル名を任意に変更します。最後に【開く】ボタンをクリックすると、クラスが作成され、メインウィンドウとクラスビューに表示されます。作成されたクラスを図 9 に示します。 .gif)
図 9 作成されたクラス (2) プロパティの追加クラスにプロパティを追加するには、直接コードを記述する方法とプロパティウィザードを利用する方法の2種類があります。プロパティウィザードを利用すれば、コードが自動的に作成され、バグが発生するのを回避することができます。そのため、ここではプロパティウィザードを利用してプロパティを追加する方法を説明します。 まず、クラスビューで追加の対象となるクラスを選択し、右クリックします。次に、表示されたメニューの中から【追加】→【プロパティの追加】を選択すると、プロパティウィザードが起動します。プロパティウィザードの起動方法を図 10 に示します。 .gif)
図 10 プロパティウィザードの起動方法 プロパティウィザードの設定項目の説明を表 2 に示します。 表 2 プロパティウィザードの設定項目 | 項目 | 意味 | | プロパティアクセス | プロパティへのアクセス方法を設定します。一般的には、クラスの外部から参照できる public を選択します。 | | プロパティの種類 | int、string、void など、プロパティの種類を選択します。 | | プロパティ名 | プロパティの名前を設定します。 | | アクセサ | プロパティのアクセス制限を設定します。get は読み込み、set は書き込みを意味し、get/set は、読み書きができることを意味します。 | | プロパティの修飾子 | プロパティの修飾子を設定します。一般的には 「なし」 を選択します。 | | コメント | コードにコメントを付加します。 |
各項目の設定が終了した場合、【完了】 ボタンをクリックすると、メインウィンドウに追加されたプロパティが表示されます。プロパティが追加後のメインウィンドウを図 11 に示します。 .gif)
図 11 プロパティ追加後のメインウィンドウ 図 11 に示すとおり、プロパティのコードは、get アクセサと set アクセサの 2 つで構成されています。get アクセサには、クラスの外部からプロパティの値が参照された時の処理を記述し、set アクセサには、プロパティに値が代入されたときの処理を記述します。ロボットクラス (RoboClass) のロボットの名前 (RoboName プロパティ) を実装したサンプルコードを次に示します。 |
using System;
namespace WindowsApplication29
{
/// <summary>
/// RoboClass の概要の説明です。
/// </summary>
public class RoboClass
{
private string strRoboName; // ロボットの名前
public RoboClass()
{
//
// TODO: コンストラクタ ロジックをここに追加してください。
//
}
/// <summary>
/// ロボットの名前です
/// </summary>
public string RoboName
{
get
{
return strRoboName; //ロボットの名前を返す
}
set
{
strRoboName = value; //ロボットの名前を代入
}
}
}
}
クラスにプロパティを実装するには、private 変数をクラスの先頭で宣言しておく必要があります。例えば、上記のコードでは、RoboName プロパティの値を保持するためには、RoboClass の先頭で変数 strRoboName を宣言します。そして、プロパティの値が参照されたときには、変数 strRoboName の値を return ステートメントで返します。さらに、プロパティに値が代入されたときには、変数 strRoboName に値を代入します。value キーワードは、プロパティに代入された値を返します。Visual C# では、set と get の二つのアクセサを利用することにより、カプセル化を実現しています。
(4) メソッドの追加
クラスにメソッドを追加するには、コードに記述する方法と、メソッドウィザードを利用する方法の 2 種類の方法があります。メソッドウィザードを利用すれば、コードが自動的に作成され、バグの発生を回避することができます。そのため、ここではメソッドウィザードを利用してプロパティを追加する方法を説明します。
まずクラスビューで追加する対象となるクラスを選択し、右クリックします。次に、表示されたメニューの中から 【追加】 → 【メソッドの追加】 を選択すると、メソッドウィザードが起動します。メソッドウィザードの起動方法を図 12 に示します。
.gif)
図 12 メソッドウィザードの起動方法
メソッドウィザードの設定項目の説明を表 3 に示します。
表 3 メソッドウィザードの設定項目
| 項目 | 意味 |
| メソッドアクセス | メソッドへのアクセス方法を設定します。一般的には、クラスの外部から参照できる public を選択します。 |
| 戻り値の型 | メソッドが値を返す場合、戻り値の型を設定します。 |
| メソッド名 | メソッドの名前を設定します。 |
| 修飾子 | メソッドに実装する引数 (パラメータ) の修飾子を設定します。一般的には 「なし」 を選択します。 |
| パラメータの型 | メソッドに実装する引数 (パラメータ) の型を設定します。 |
| パラメータ名 | メソッドに実装する引数 (パラメータ) の名前を設定します。 |
| パラメータの一覧 | メソッドに実装する引数 (パラメータ) の一覧が表示されます。 |
| メソッドの修飾子 | メソッドの修飾子を設定します。一般的には 「なし」 を選択します。 |
| コメント | コードにコメントを付加します。 |
メソッドウィザードでは、引数 (パラメータ) をメソッドに追加することができます。パラメータの型とパラメータ名に必要事項を記述し、【追加】ボタンをクリックすると、パラメータの一覧に引数が追加されます。引数の追加方法を図 13 に示します。
.gif)
図 13 引数の追加方法
各項目の設定が終了した場合、【完了】 ボタンをクリックすると、メインウィンドウに追加されたメソッドが表示されます。メソッド追加後のメインウィンドウを図 14 に示します。
.gif)
図 14 メソッド追加後のメインウィンドウ
メソッドウィザードは、追加するメソッドの枠組みを作成します。しかし、メソッドが呼び出されたときにどのような処理を行うかは、開発者が追加されたメソッドにコードを記述する必要があります。ロボットクラス (RoboClass) が 「Hello」 というメッセージボックスを表示するメソッドを実装したサンプルコードを次に示します。
/// <summary>
/// 挨拶メソッド
/// </summary>
public void SayHello(string Target)
{
System.Windows.Forms.MessageBox.Show("Hello" + Target);
// メッセージボックスの表示
}
(4) インスタンスの生成
上記のとおり、クラスを作成し、メソッドとプロパティの定義が終了すると、クラスを呼び出す準備が整いました。定義したクラスをオブジェクトとしてプログラムから利用するためには、クラスからインスタンスを生成し、プロパティの呼び出しやメソッドを実行する必要があります。ここでは、作成したクラスからインスタンスを生成する方法とプロパティとメソッドの呼び出し方法を説明します。
作成したクラスは、new キーワードでインスタンスを生成することができます。作成したクラスからインスタンスを生成するための構文を次に示します。
クラス名 オブジェクト名 = new クラス名();
RoboClass クラスからインスタンスを生成し、プロパティおよびメソッドを呼び出すサンプルを次に示します。
private void button1_Click(object sender, System.EventArgs e)
{
RoboClass myRobot = new RoboClass(); //インスタンスの生成
myRobot.RoboName = "ロボ太郎"; // 名前プロパティの設定
myRobot.SayHello(myRobot.RoboName); //挨拶メソッドの実行
}
2.4 まとめ
本章では、オブジェクト指向言語の概念と実際の作成手順を解説しました。オブジェクト指向プログラミングである Visual C# を習得することにより、独立性の高いプログラムを作成することができます。また、プログラムを再利用することにより、開発に要する時間とコストを最小限に抑えて研究やプログラム開発ができるようになります。
オブジェクト指向プログラミングは、ソフトウェア開発の現場で確固たる地位を確立し、様々な研究や開発に活用されています。例えば、オブジェクトと人工知能 (A.I.) 技術を駆使して開発するエージェント技術がその際たる例です。エージェントとは、ネットワーク上で自律的に行動するソフトウェアです。また、マルチエージェントシステムは、複数のエージェントが自律的かつ協調的な行動により問題解決を実現するシステムです。
オブジェクト指向が、外部からのメッセージで処理を実行する受動的な考え方であるのに対して、エージェント指向は、独自の価値基準で状況を判断し、処理を実行する能動的な考え方です。このことから、エージェント技術は、オブジェクト指向の先を行く技術であると言えます。
エージェント技術として代表的な研究は、RoboCup が挙げられます。RoboCup とは、2050 年までにロボットのチームと人間のチームがサッカーの試合を行い、ロボットのチームが勝利することを目的としているグランドチャレンジのことです。RoboCup には、様々なリーグが用意されており、その中でもシミュレーションリーグで利用されるエージェントをオブジェクト指向プログラミングで開発する動きが最近では活発です。
また、Microsoft 社では、.NET Framework 技術を利用した Terrarium (テラリウム) というゲームを発表しています。Terrarium は、植物・草食動物・肉食動物などのエージェントをプログラミングし、ピアツーピアのネットワーク上で、他の開発者のエージェントとの優劣を競うゲームです。Terrarium の実行画面を図 15 に示します。
.gif)
図 15 Terrarium の実行画面
Terrarium におけるエージェントのクラスを開発することが、Visual C# で盛んに行われています。開発者たちが、エージェントの開発を行う場合には、本章で学習したオブジェクト指向の概念や技術が重要となります。
著者紹介
田中 成典 (たなか しげのり)
| 1986年 | 関西大学工学部土木工学科卒業 |
| 1988年 | 関西大学大学院工学研究科 土木工学専攻博士課程前期課程修了 |
| 1996年 | 博士 (工学) 授与,関西大学 |
| 1997年 | 関西大学総合情報学部助教授 (現在に至る) |
| 主な著書: | やさしいCのはじめかた,オーム社,1993年 |
| | 建設技術者のための知識情報処理の実践,関西大学出版部,1999年 |
| | DirectX8,工学社,2001年 |
| | ステップアップXML,工学社,2002年 |
| | Linuxアプリケーション入門,森北出版,2002年 ほか |
中山 浩太郎 (なかやま こうたろう)
| 2001年3月 | 関西大学総合情報学部卒業 |
| 2001年4月 | 関西大学大学院総合情報学研究科入学 (現在に至る) |
| 2002年4月 | 同志社女子大学非常勤講師 (現在に至る) |
| 主な著書: | Web工房シリーズ Perlの達人,森北出版,1999年 |
| | DirectX8,工学社,2001年 |
| | Linuxアプリケーション入門,森北出版,2002年 ほか |
石井 健一 (いしい けんいち)
| 1999年4月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 主な著書: | ステップアップXML活用法,工学社,2002年 |
野中 一希 (のなか かずき)
| 1999年4月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 2002年1月 | 株式会社関西総合情報研究所入社 (現在に至る) |
中村 健二 (なかむら けんじ)
| 2000年4月 | 関西大学総合情報学部総合情報学科入学 (現在に至る) |
| 2002年4月 | 株式会社関西総合情報研究所入社 (現在に至る) |
ページのトップへ