C#を通じてオブジェクト指向をマスターしようとする気長な講座

ホーム / DOS/V

更新:12/07/01 | C#徹底講座 | DOS/V

関連記事一覧

C#徹底講座とは?

C#(しーしゃーぷ)とは、この連載では基本的にMicrosoft社の.Net開発環境の一つである「C#」を指します。

C#はJava、Basic、C++の良いところを集めてまとめた集大成とも言える優れた言語(開発環境)です。 この徹底講座では、私がC#を学習するのにあわせて有用な情報などをまとめておくために設けたものです。つまり、基本的には自分のためのC#日記のようなものです。

本ページは著者自らの理解と備忘録のために書いた物のため、嘘(故意ではないですが)や間違いが多く含まれている可能性が多分にあります。 実際にかなり適当に書き進めていますので、頻繁に内容が予告も告知もなしに修正されますが、どうぞ、ご容赦下さいませ。

ちなみに、筆者である私のプログラミング技術レベルはVB6やObjective-CやRuby(OnRails)でフリーソフト、シェアウェアを幾つか作成したことがある程度のレベルでC#については机上の知識が少しある程度です。

ですから、プログラミングに関して全くの初心者の方には読み進めづらいかもしれません。VBでのプログラミング経験がある人であれば、読み進められる程度の内容になっているはずです。

基本から応用までを段階的に押さえられるように改訂していく予定ですので、かなりの初心者にも読める内容にはなっていくと期待されます。

最終目標は次の通りです。

Back to Top

はじめに

まず、連載「改訂版 C#入門」が良くまとまっていて、全体を把握するにはもってこいの記事だと思われます。

ちょっと情報が少なく、初めて読む人間には難しく感じるのですが、とりあえず一通り読んでおくと良いと思います。

おそらく、『オブジェクト指向って何?Javaなんて難しくて…』という状態に人には、連載を読んでもあまり情報が頭に残らないかもしれませんが、気にすることは全くありません。何となくキーワードに慣れることがまずは重要なのです。

今使っている言語がある場合、わざわざC#を学習する理由があるのだろうか?と考えるかもしれません。必要性や興味がないと新しい情報の吸収性は悪くなりますので、まずはC#や.Net Frameworkのメリットを実感することが重要です。

Back to Top

オブジェクト指向の心得

C#はオブジェクト指向言語と言われる開発言語です。本屋に行けばやれオブジェクト指向はうんぬんかんぬんと、先を争うように目に飛び込んでくるキーワードです。

しかし、C#もオブジェクト指向言語である以上、やはり「オブジェクト言語」ならではの性格や考え方に則したコーディングを行う必要があります。というよりも、そうするように作られているので自然と従わざるを得ないのです。

避けては通れない道であり、積極的に体得することで生産性は向上すると考えて良いと思います。

オブジェクト指向のオブジェクトとは何でしょうか?

部屋に飾るオブジェを思い浮かべてみると、漠然と「物」であることが想像されます。(あまり良い例えではなかったですね)
飾り物ですから決まりはありません、色々な形や色をしていますし値段も様々です。しかし、「物」ありきのオブジェです。

つまり、オブジェクト指向とは「何か物」を中心としてプログラムが作られていく構造を指します。

この物を単位にしてデータやプログラムを一塊にしていきます。

当然、この「物」という考え方は物理的な物だけを指すわけではありません。人間が細胞の固まりであるように、割り切りやすい一つの固まりを指しますから、考え方や思想・物語でも良いわけです。

例えば、「家」というオブジェクトを想定した場合、情報として「色」「階数」「窓の数」「玄関の向き」など様々な要素が考えられます。

これらの静的な要素(特定の値)をC#ではフィールドプロパティと呼んでいます。

更に、情報に加えてもう一つ、動きのある要素も加える必要があります。

例えば、「ピンポン(呼び鈴)を押す」「蛇口をひねる」「ドアノブを引く」といった要素です。これらの動的な要素(特定の動作=プログラム)をC#ではメソッドと呼んでいます。

この、フィールドとメソッドという要素で、オブジェクトを彩っていくことで、自然とオブジェクト同士の結びつきが生まれ自然な流れでプログラムが構築されていく絵姿を描くことができるのです。

そのため、プログラミング能力とはちょっと違った物事をオブジェクトに置き換えて考えられる力が必要となります。

一つの事象に対して、どんなオブジェクトを想定したらいいのか、どんなフィールドやメソッドを実装(実際に動作するように具体化すること)したらいいのかというセンスが問われるわけです。

Back to Top

オブジェクト指向のメリット

何故オブジェクト指向なのか? この点をはっきりしないと、オブジェクト指向な考え方を修練する気になりません。

オブジェクト指向では、プログラムは流れると言うよりも自然発生的に実行されていきます。何を言っているかというと、より自然界に近い状態でプログラムを実装できる、また、より簡単に複雑な世界を再現できるという特長があるのです。

物語としてプログラムを書いてしまうと、登場人物の性格や特長が変わるたびにプログラマーは物語自体も変えなくてはなりません。『金太郎が女だったら……きっとこんな風なストーリーに変わっていただろう』といったイメージです。

ところが、オブジェクト指向ではストーリーはなるべく考えないようにします。まずは登場人物=オブジェクトの特長を観察し定義し、反応やリアクションをプログラミングしていきます。

熊やうさぎ、もろもろの登場人物を記述し終わったら、ぽんと金太郎の背中を押してやるだけです。後は、オブジェクト同士がその特長に従ってストーリーを展開していくわけです。この時展開されるストーリーは、わざわざ緻密に物語をプログラミングしなくても、正しくオブジェクトがプログラミングされていれば予定通りのストーリーになるはずです。

さて、金太郎の性別が女に変更されたらどうするのでしょうか?
そうです、金太郎というオブジェクトの特徴だけを変えればいいのです。すると、同じ金太郎でも反応も違えば見かけも違うため、自然とストーリーはそれなりに変化をもたらされるわけです。

Back to Top

サンプルコード Hello World!

まずは、サンプルコードHello World!を見てみましょう。

Hello World!とは、C#の世界へようこそ!という意味を込めて、「Hello World!」と表示するだけのプログラムの事で、どんな言語でもまずはここから始めるというのが伝統となっています。

Hello! World

さて、このコードにはそれなりにC#のポイントがちりばめられています。

using
useは「使う」ですから、usingは「使ってる」です。using 〜とすると、〜を使ってますよという宣言になります。
この宣言をすることで、〜に含まれるクラスライブラリを優先的に検索してくれるようになります。
クラスライブラリや自分で作ったネームスペースには同じ名前のクラスなどが含まれる可能性があります。そんなときに、Aというネームスペースに含まれるClass1というクラスと、Bというネームスペースに含まれるClass1が存在していても、 using Aと宣言しておくことで、Class1という記述はAのClass1だなと勝手に判断してくれるようになるわけです。
このように、ネームスペースという考え方によって同名のクラスなどが存在していても、ネームスペースを分けて区別できるようになっています。
sですから、自分でオリジナルなネームスペース名さえつけてあげれば、その中で自由にクラス名を命名しても他のネームスペース内のクラス名と重複する危険性を考慮する必要はなくなります。
namespace
早速、その下にnamespaceというキーワードが登場します。
このnamespace AAA{〜} と、括弧で囲まれた中身は、全てネームスペース名AAAの配下にあると定義づけられます。
ここでは、 ConsoleApplicationなどという適当なネーミングになっていますが、現実にはもう少し気の利いた名前にしてあげたいところですね。
コメント
緑色になっている部分はコメントです。プログラムとしては認識されません。
基本的に『//』や『/*〜*/』といったキーワードによってコメントは表現されますが、『///』となっているのはコメントにも種類があって、『/』の数によって後から再利用するときの区別をしているのです。
[STAThread]
Threadとはスレッドのことで、スレッドとはプログラムの動作単位です。
マルチスレッドとは、一つのプログラムだが、複数の処理を平行して走らせられる仕組みです。詳細は、別途ご紹介します。今はあまり気にしなくて良いと思います。
static void Main(string[] args)
プログラムは起動時にどこから処理を開始するかを決めておかなくてはなりません。それが正にこのMainというクラスです。しかし、ただのMainではありません、色々と情報が付加されています。
staticとは静的という意味の修飾子で、staticがついたメンバを静的メンバと言います。C#ではインスタンスを生成しなくても、設計図のままいきなり呼び出して利用できますという宣言とみなされます。
静的メンバに対して、インスタンスを生成しないと使えないメンバをインスタンスメンバと言います。このほかにも色々と修飾子が存在していて、メンバの役割を宣言するのに役立っています。
オブジェクト指向では設計図と実体がつきもの…とはいえ、必ず設計図(クラス)→実体(インスタンス)という順を追わなくてはならないわけではないのです。利便性を考えて、インスタンスを作らなくても良い場合も想定されているのです。
但し、注意しなくてはいけない点としてインスタンスを作らないが故に呼び出し手がいくら多く存在していたとしても、呼び出されるクラスは設計図にかかれているただ一つのクラス(同一の物)という事です。
インスタンスでは、一度作成された実体は個々に固有のプロパティなどを保持・維持できますが、static宣言されたクラスやプロパティは常に単一の物なのです。
voidは、戻り値がないことを指しています。戻り値とは、呼び出されて一通りの処理を行った結果を呼び出してに伝えることを言います。
(string[] args)は引数です。このMainというクラス、つまりこのプログラム自体に引数が渡された場合にstring型の変数argsとして受け取りますと言うことを宣言しています。
Console.WriteLine("Hello World!");
この一行がこのプログラムの唯一の処理の実体となります。
Console(コンソール)にHello World!と表示しなさいという命令になります。
Console.WriteLineと「.」でくっついていますが、このピリオドによってConsoleに属しているWriteLineという意味になります。
Consoleもオブジェクトの一つですから、様々なメンバを保持しているはずです。その中の一つであるWriteLineを呼び出しているのです。
括弧で"Hello World!"がWriteLineに引き渡されていることから、WriteLineというメンバはプロパティではなく、メソッド(何かを受け取って処理を行うプログラム)であることが分かります。
Back to Top

VisualStudioのアシスト機能

補完機能

C#には色々なクラスライブラリが用意されているし、それらはオーバーライドやオーバーロードして再利用しなくてはなりません。当然、オーバーロードすれば引数によって同じクラスでも振る舞いが変わるわけで、一筋縄では必要なクラスライブラリやその使い方を把握できそうにありません。それ以外にも、クラスには様々なメソッド、プロパティ、フィールドが存在しているはずです。これらをいちいち調べながらプログラミングを進めるのは骨の折れる作業です。

そんなときに役に立ってくれるのがVisualStudioそのものです。実際にコンソールアプリケーションを作成してみましょう。

「Console.」と、Consoleの後にピリオドを入力すると、自動的にConsoleのメンバが表示されます。これで、Consoleにどんなメンバが存在しているのかが一目瞭然です。英語の意味が分かれば何となく機能も想像できます。

また、何かを指さしているのはフィールド、箱が飛んでいくアイコンはメソッドとなっています。

更に、それぞれのメンバにカーソルを当てるとバルーンヘルプに使い方や機能、特徴、引数などが簡潔に表示されます。

WriteLineというメンバの場合、void修飾子によって戻り値がないメソッドであることが分かります。括弧内を見ると大体の引数が分かります。実査にはオーバーロードされているため引数の取り方は色々変化します。

そして、これらのオーバーロードは表示されている用法以外に更に18種類、合計19種類に及んでいることも分かります。

この1行ヘルプが強力で、人のソースを呼んだり自分で機能を探したりする際に大変役立ちます。従来のVisualStudioでは与れなかった恩恵です。

ここで、WriteLineに決めてTabを入力すると確定されます。

そして括弧を入力したとたんに今度はオーバーロードの用法がバルーンヘルプで表示されます。全段と同様にカーソルで19種類のオーバーロードをそれぞれ見ながらどういった使い方をするのかを参照できます。

更に細かい内容については、WriteLineを選択した状態でF1キーを押せばヘルプを参照できます。

更に、一番最初のプログラム全体を見ると、Console.WriteLine("Hello World!")の後に赤い波線が入っているのが分かります。

『ここに何か足りないのでは?』という指摘なのです。これを見逃さなければシンタックスエラーはかなり削減できるでしょう。ここでは、C言語系ではおなじみのセミコロンが抜けていることを指摘しているのです。

参照と定義

参照とはそもそも、あるクラスの中で、他のクラスのインスタンスを生成したりする際に「他のクラス」を「参照」するというイメージで利用される言葉です。例えば、Aというクラスの中でBというクラスのインスタンスを生成する際には、Bという名前こそ登場しますがその内容は図りしれません。

Public B newinstance = New B;

そこで、「Bって何だよ〜」という気持ちは常に沸いてくるのです。そんな場合に便利なのが「参照」と「定義」です。実は、VBなどではVisualStudio6の時代には定義は存在していました。

ここでは「B」を選択した状態で右クリックをすると、コンテキストメニューが表示されます。
その中の「定義」を選択することでクラスBを定義しているプログラムにジャンプすることが出来るというものです。

今度は、逆にクラスBの定義を見ていて、「一体、どこからこのクラスBは参照(利用)されているんだろう?」と考えることがあります。そんなときに便利なのが「参照」コマンドです。

コンテキストメニュー下方に、「定義へ移動」と「参照へジャンプ」があるのが分かります。

Back to Top

クラスのアクセシビリティ

アクセシビリティとは、「アクセスの仕方、出来方」を示すもので作成されたクラスがどこからでも参照できてしまっては困る場合がありますし、また、参照の仕方にもルールというものが若干あるのです。

重要機能

デリゲート

.NetではC#以外にもVB.Netでこのデリゲートという考え方が導入されています。そもそもデリゲートとは、Delegateという一つの型になっています。Delegateを辞書で引いても載っていません。デリバリーゲートの略なのでしょうか? 兎に角、Gateの名の通り通り道的な意味合いがある気がします。

このゲートは現在と未来をつなぐために利用されます。『現在=あるオブジェクトを作った 』『未来=あるオブジェクトから呼び出されるメソッドが存在する』と考えられます。

つまり、現在作っているオブジェクトには、呼び出したいけれども、まだ存在しない(どんな名前になるか決まっていない)メソッドが存在するシチュエーションが現実には少なからずあるということです。

そんなシチュエーションは頻繁にはお目に掛からないわけですが、想像もつきづらいですね。一番身近なのはライブラリとして提供されるオブジェクト、例えばフォームに貼り付けるボタンなどのイベント処理です。

デリゲートのイメージ

ボタンは汎用的なもので、必要に応じて勝手に作成・利用されます。しかし、ボタンというものはわざわざボタンの親玉たるスーパークラスから継承したり、毎回インスタンスを起こして利用するたぐいの物ではありません。フォームにButtonという名前のボタンを貼り付けたら、そのときからButton_Clickというメソッドを利用できるようになるのです。そのため、ボタンという汎用的なオブジェクトを作成する時点では、利用シーンによって幾つ使われるか、どんな名前で使われるか分からないためクリックされた時にどんな名前のメソッドを呼び出せばいいのか分からないわけです。

そこで、分からないものは分からないなりに適当にあしらっておくためにデリゲートは存在します。デリゲートというゲートに放り投げておけば、実行時にもなればちゃんと受け止めてくれる相手をデリゲートを通じて処理してくれるという仲介役になっているのです。

ポイントは、今作っているオブジェクトが未知の何かを呼び出さなくてはならない事があるという点です。そのため、利用されるシーンはイベントを伴うオブジェクトの定義などに主に利用されます。ゴミ袋はゴミ袋以外の用途にも利用できますが、雨合羽に使う人はまずいませんし、やっぱりゴミ袋として使われることが多いように(?)、デリゲートもイベント処理に専ら利用されている…という現状があるようです。

Back to Top

関連記事一覧

 
お勧めリンク
ダウンロード
ストリーミング関連
Macintosh関連
Windows関連
メディアなど
 
ハードウェア
ソフトウェア/サービス/開発SDK
デジタル一眼レフカメラ
テクニカル記事
趣味関連
ゲーム 〜楽しいゲームの紹介や攻略法
RoverMNI(ローバーミニ) 
雑記
その他
コメント・フィードバック
©1998 CNXGROUP. このページの全部あるいは一部を無断で利用(コピー)することを禁じます。
>