はじめに
本連載では,実際にVB6で開発したソフトウェアをC#に置き換えながら基本的な技術を学んでいただきます。
前回は,「第2回 VB6で作ったサンプルソフト」でご紹介したVB6のコードを,可能な限り忠実にC#のコードに単純に移植した後に,要点をご説明していきました。 これによってC#でまったく同じ動作をするソフトウェアを作成することができました。 また,その内容についてもVB6のコードを見比べていくことで比較的容易に理解できたのではないかと思います。
しかし,見比べるという点についてを意識したため,前回ご紹介したコードは,およそC#らしさというものがありませんでした。
では,VB6のサンプルコードをC#に移植するのではなく,VB6のサンプルソフトと同様のものを最初からC#で開発した場合はどうなるのでしょうか?
これを理解していただくために,今回は.NETプログラミングの基本とも言えるオブジェクト指向プログラミングについてを2回に渡ってご説明していきたいと思います。
オブジェクト指向の基本
最初にオブジェクト指向の基本的なことをご説明します。
オブジェクトとしてイメージする
「第2回 VB6で作ったサンプルソフト」の終盤でも述べた通り,今回サンプルとしているソフトウェアは,いくつかの独立性の高い処理に分けることができます。- ユーザーインターフェイス関連
- 処理ロジック関連
- データアクセス関連
また,データを入れておくためのオブジェクトも用意したほうがよさそうです。
では,ひとつのアプリケーションを,このようにオブジェクトとして切り分けることに一体何の意味があるのでしょうか?
この回答ですが,私としては「保守性」という言葉で表現できると思っています。
デバッグ・テスト・機能追加など,コードは繰り返し読まれることになるため,常にわかりやすく整理されている必要があります。
つまり,我々は,開発と同時に既存コードの保守も行っていることになります。
この保守性を向上させる方法として,オブジェクト指向プログラミングが有効であると考えることができます。
例えば,上記のように,ソフトウェアの処理をオブジェクトという単位で分類し,各オブジェクト同士の結合度を低くすることによって,コードの独立性が高まります。 独立性が高まれば,各処理の変更によるほかへの影響がわかりやすくなりますし,再利用性も高まります。
オブジェクト指向三大要素
オブジェクト指向の三大概念,三大機能などと表現されている場合もありますが,内容は同じです。 各内容の実例は,実際にコードを解説する際にご説明させていただきますので,ここでは概念だけを理解していただければ大丈夫です。
- カプセル化(隠ぺい)
例えば,テレビというオブジェクトのインターフェイスは,チャンネル切り替えボタン・電源ボタン・音量ボタンがあります。そして,テレビの中にあるさまざまな仕組みは,利用者から見えない場所に置かれています。
クラスが公開するメンバも同様に,そのオブジェクトのインターフェイスとして捉えることができます。
適切なアクセス修飾子(private,publicなど)を各メンバに用いることで,わかりやすいインターフェイスを持ったオブジェクトを作ることができます。
- 継承
例えば,一定時間が経過したら自動的に電源が切れるテレビを作る時,最初から作るよりも,既存のテレビを元にして機能を拡張したり一部の機能を置き換えるほうが生産性も保守性も高いと考えられます。 これと同様に,既存のクラスを新しいクラスに継承することができます。 また,継承したクラスをさらに新しいクラスに継承できます。
継承する元となるクラスを,継承元クラス,スーパークラス,基本クラスなどと表現します。 継承したクラスを,継承クラス,サブクラス,派生クラスなどと表現します。
- ポリモーフィズム(多様性・多態性)
例えば,タイマー付きテレビや,ビデオ付きテレビなど,さまざまな種類のテレビというオブジェクトがあるとします。 しかし,単純に「テレビ」として定義されている機能はすべて共通です。
従って,「タイマー付きテレビのスイッチを入れる」のように何かの「振る舞い」をしたい場合,いろいろな種類のテレビを単に「テレビ」として表現できれば,「テレビのスイッチを入れる」という「振る舞い」を共通化できます。
このように「タイマー付きテレビ」や「ビデオ付きテレビ」を「テレビ」と表現することが,オブジェクト指向におけるポリモーフィズムになります。
C#のコードにおいても,ひとつのオブジェクトは多種多様な型に代入できます。
例えば,家電クラスを基本クラスとするテレビクラスがあり,テレビクラスを基本としたタイマー付きテレビクラスがあるとします。 タイマー付きテレビクラスから生成されたオブジェクトは,その基本クラスであるテレビ型や,家電型に代入できます。 逆に,家電型に格納されているタイマー付きテレビオブジェクトを,元のタイマー付きテレビ型に代入することもできます。
つまり,継承を繰り返したクラスから生成されたオブジェクトは,それらの基本クラスのすべての型に代入できます。
森羅万象がオブジェクトである
すべてのオブジェクトはObjectクラスから派生しています。
例えば,基本クラスが指定されていないクラスの場合,Objectクラスを継承したことになります。 つまりは,以下のように記述したことと同じです。
class MyClass : Object {}
このため,すべての変数はobject型に代入できます。

