【C# WPF】WPFを理解したいC#初心者の話【オブジェクト指向編1】

C# WPFについて学んでいく過程を備忘録として残して置きたいと思います。

1. C#でのプログラミングをするにあたって


前回、C#とXAMLについてまとめました。

その中で登場した「オブジェクト指向」について、更に詳しく知る必要があると考えたので、今回はオブジェクト指向とは一体何者であるかというところから調べてまとめていきたいと思います。

2. オブジェクト指向プログラミングとは?


オブジェクト指向とは、プログラムを「モノ」と「振る舞い」に分けて組み立てるようなプログラミング手法です。

オブジェクト指向を理解するためには「オブジェクト」「クラス」「インスタンス」についての理解が必要になります。

2-1. オブジェクトとは?

「オブジェクト」とは、「属性(データ)」と「メソッド(手続き)」の2つの要素を持ったモノです。

この2つを一体化させたものを1つの「オブジェクト」として定義します。


「属性」とは、オブジェクトを特徴付けるような情報を表すデータのことで、「プロパティ」とも呼ばれます。「モノ」に該当する部分ですね。

一方、「メソッド」はデータに対する処理内容を含んだプログラムです。こちらが「振る舞い」に該当する部分です。


「車」というオブジェクトがあるとすると、車を構成する「タイヤ」「ハンドル」等が属性、アクセルやブレーキの操作による「前に進む」「減速する」といったところがメソッドに該当します。

2-2. クラスとは?

「クラス」とはオブジェクトの性質ごとに定義や分類を行った際の分類のことです。

オブジェクト毎に様々な特徴や動作がありますが、それを分類・定義してクラス分けを行い、クラス同士の関係性を定義することで、上位のクラスには共通の性質、下位のクラスは上位のクラスに独自の性質を加えた形になります。


先ほど車で例えましたが、車には様々な車種が存在します。

例えばプリウスとタントという2つの車は異なる車種ですが、どちらも4輪の「タイヤ」を持ち、アクセルを踏むと「前に進む」車です。

この共通する部分を「車」というクラスに分類し、具体的な車種は「車」の性質を持つ「プリウス」「タント」という下位の2つのクラスに定義することができます。

2-3. インスタンスとは?

「インスタンス」とは、先ほど紹介した「クラス」を基に作られた実体のことです。

クラスが設計図の役割を果たし、インスタンスはそれを基に作られ、基になったクラスの性質を持つことになります。


またもや車で例えます。

「プリウス」という車種がありますが、実際に街中を走っているプリウスが「インスタンス」です。

車種自体はあくまで設計図やカタログの中のモノであって、それは実際に運転することができませんが、それを基に組み立てられて様々な持ち主のところに実際に運転することができるモノとして出来上がったモノがインスタンスと考えることができます。

3. なぜオブジェクト指向を使う?


オブジェクト指向の理解に必要な「オブジェクト」「クラス」「インスタンス」の概念が少し理解できたと思います。

では、実際になぜこのような複雑な概念を用いた開発が行われているのかを解説したいと思います。


まず前提として、オブジェクト指向の考え方はなにもプログラミングだけに当てはまるものではありません。

先ほどまで車の例えで説明をしましたが、現実世界の様々なものはオブジェクト指向のように考えることができます。


例えば複数人でチームを組んでひとつのゲームを制作するとします。

ゲーム制作での各担当者の業務をかなり簡単に説明すると、「プランナー」が仕様決定や調整の業務を、「プログラマー」がゲームの動作をプログラムで作る業務を、「デザイナー」がグラフィック部分の制作の業務を、「サウンドクリエイター」が音楽や効果音の制作の業務を行います。


彼らはそれぞれで違う仕事をしていますが、目的は同じひとつのゲームを作ることです。

このように各工程に必要な技術・知識を持つ人ごとに分担して適切な業務を遂行することで、より効率的に作業を進めることができます。


オブジェクト指向とはそういった適切な処理の切り分けによって開発を円滑・効率的に進めることに適した考え方です。

この考え方に明確なルールが存在するわけではありませんが、プログラミングの手法としては主流になってきていますので、頑張って概念の理解を進めましょう。

4. オブジェクト指向の4大要素について


オブジェクト指向には基本的な考え方として以下の4つのものが挙げられます。

・カプセル化
・抽象化
・継承
・ポリモーフィズム


4-1. カプセル化

「カプセル化」とは、ほかのオブジェクトと干渉しあわないようにする仕組みのことです。

プログラム内ではオブジェクト同士で情報のやり取りを行ったり、情報を書き換えたりといったことが起こりますが、場合によっては書き換えられると困る部分があります。

カプセル化ではそういったことを防ぐことができます。


例えばあなたの家にある一冊の本を友人に貸すとき、よほど信頼のおける友人でもないのなら、勝手に家に入られて本を持っていかれるのはちょっと怖いですよね?

その途中で見られたくない物を見られたり、関係のないものを持ち出されたりするのは困りますよね?

そういう状況を避けるために、友人には玄関で待ってもらって、実際に家の中から本を探して友人の手に渡すまではあなた自身が行う、そういった仕組みがカプセル化になります。

4-2. 抽象化

「抽象化」とは、複雑な内部構造を隠して、外から触れられる部分を限定することで内部の詳細を知らないユーザーでも利用しやすくする仕組みのことです。

先ほどの家の本を例に出すと、友人はあなたの家のどこに何が置いてあるのかを知りませんが、あなたは自分の家の物の配置を熟知しているので、本の貸し出しにあなたを通すことで、あなたの家のことを知らないままにスムーズなやり取りが可能になります。

4-3. 継承

オブジェクト指向の説明の中で登場した「上位のクラス」「下位のクラス」について関わってくるのが「継承」です。

「プリウス」は「車」の性質を有する「乗り物」という性質を持つように、下位のクラスは上位のクラスの性質を受け継いでいます。

これこそが「継承」とよばれる仕組みであり、既存のオブジェクトで定義したコードを再利用して新しいオブジェクトを生成することです。


親にあたる上位のクラスを「スーパークラス」、それを継承したクラスを「サブクラス」と呼びます。つまり「乗り物」は「車」のスーパークラスで、「車」は「プリウス」のスーパークラス、その逆に「プリウス」は「車」のサブクラスで、「車」は「乗り物」のサブクラスとなります。


クラスにこういった階層を定義することのメリットは、共通の部分の定義はスーパークラスで行い、サブクラスではそのオブジェクト固有の性質や特徴のみを記述することで、開発効率を挙げることにつながることです。

また、共通の処理部分を修正しなければならないという状況になった場合に、スーパークラスで定義した共通部分を修正することで、それを継承しているすべてのサブクラスの修正もできます。

4-4. ポリモーフィズム

「ポリモーフィズム(多様性)」とは、同じ指示(メソッド)に対して、その指示を受けたクラスごとに異なる動作をする仕組みです。

「オーバーライド」という、継承を利用してクラスを定義する際に継承元のメソッドをサブクラスで再定義して上書きする仕組みがあります。

これを利用することで同じメソッドから異なる動作を再現できます。


例えば車ではアクセルを踏むと「前に進め」という指示(メソッド)が出されます。

ですが「プリウス」と「タント」では同じ「前に進め」でも加速のスピードが異なりますよね。


オーバーライドとはつまり、同じ指示からオブジェクト毎に異なる振る舞いを行うことができる仕組みであり、これがポリモーフィズムと呼ばれます。

5. まとめ

今回はオブジェクト指向の特徴についてまとめましたが、調べてみるとまだまだ情報が多い印象でした。

ここで書くには量が多すぎると感じたので、次回も引き続きオブジェクト指向についてをまとめようと思います。


もう少し具体的な部分に触れつつ、学習を続けていきましょう。