[設問1] クラスとインスタンスの説明をしてください。

[解説1] クラスはひな形です。何かしらの概念を投影した型とも言えます。

例えば、プリミティブな型ならint、char等があると思いますが、intは数字と言う概念を持った型であり、charは文字と言う概念を持った型になります。

クラスも同様に型であり、自由に概念を持たせる事ができます。

ではインスタンスはと言うと、その型を具体化した実体になります。

その実体は、インスタンス間で独立して、固有の状態を持つことができます。

状態とは別の言い方をすれば、クラスのメンバ変数に値が設定されたと考えれば最も単純で、具体的に、int型のメンバ変数(変数X)があれば、

インスタンス1:変数X=3

インスタンス2:変数X=15

になる事ができます。※値に特に意味はありません

ここで重要なのは、固有の状態になれると言っても、必ずひな形であるクラスの規則に従う事になります。

当たり前ですが、クラスに定義のない変数Yが登場する事はありません。(完)

[設問2] 構造体とクラスの違いについて説明してください。

[解説2] 構造体もクラスも、解説1で記載した概念を投影したものと言えます。

そして、双方とも概念に必要な変数群を保持します。

ただ、クラスはメソッド(関数)を持つことができます。では、このメソッドは何のために存在しているのか?

大別すると2つの役割があると考えられ、

1:外部からの指示を受け付ける

2:クラスの振る舞いを定義する

1は概念に則した指示を受け付けるためのもので、これを介して外部は概念を操作したり、情報を取得したりします。基本的には、publicメソッドになります。また、これは概念にとってのトリガになります。

2は1の指示により、概念が状態を変化させるためのもので、この変化が振る舞いであり、概念の変化する規則をメソッドで決めます。publicメソッドに実装する場合もありますが、protected、privateメソッド組み合わせ実現する場合も多いです。

では構造体はと言うと、振る舞いを持てないため、自分の変化を決める事ができません。変化は外の誰かが担う事になります。単なるデータの置き場にすぎません。

同じようにデータ(変数)を持っていますが、

構造体:言われた事だけやっている(変数を保持している)

クラス:自立して行動できる(変数を保持しつつ、変化させられる)

(完)

[設問3] C++概念の隠蔽について説明してください。

[解説3] 隠蔽は、アクセス指定子のprotected、privateによって外部からメンバ変数へのアクセスを規制する事を指します。

これが分かっていれば、回答としては要件を満たしています。

しかし、ここはオブジェクト指向の勉強の場なので、その観点から考えてみたいと思います。

じゃ、なぜアクセスを制限するのか?それは、メンバ変数を触ってほしくないからでしょう。

触らせなければ、値の変化を管理する事ができます。

不用意な値に書き替えられることを防ぐ事ができ、プログラムとしての安全性が増すでしょう。

でも、もっと大事な事は、値の使い方(判断)を好き勝手にさせない事ではないかと考えます。

具体的に、変数X=3があった時に、

・3だったら処理継続

・3だったらアプリ終了

と言う2つの判断が果たして正解なのか、また、永続的に判断に矛盾が出てくる事はないのか?

そう言った事を、ある程度是正できる事が、隠蔽の利点だと考えます。

ここで疑問なのが、使う側としては、隠蔽された値を知らなくて問題ないのか?です。

これは、次のカプセル化で考えてみたいと思います。

(完)

[設問4]カプセル化について説明してください。

[解説4] カプセル化と言うと隠蔽と同義と捉える事も多く、明確な定義はないのですが、オブジェクト指向的概念からの見解を述べますと、

隠蔽は、privateだからメンバ変数にアクセスできない事と言われがちですが、本来、アクセスできないのでは無く、アクセスする必要がない事が理想であると考えます。

それが、隠蔽と言う概念も含めたカプセル化です。

つまり、相手のメンバ変数にアクセスできるとかできないとか、極論どうでも良くて、仕事を依頼すれば、ちゃんと仕事して結果を教えてくれる。

どんな方法で実現したかは知らなくてよい。

そして知らないから、依存しないという事に繋がります。

それを実現するのは役割分担です。各クラスが独立して自分の知るべき事を知って管理しており、他のクラスの事は深くは知らない、そんな分担が実現できればカプセル化に繋がる事になります。

その分担の振り分けの指針がオブジェクト指向の概念になります。※これから学びます

最後に、カプセル化をもう一度簡単に言うと、

「アクセスできない」のではなく、「アクセスする必要がない」です。

(完)

[設問5]C++の「継承」の説明と利用するケースやそのメリットを説明してください。

[設問6]継承では「汎化」「特化」と言う用語を使いますが、どのような意味か説明してください。

[設問7]クラスを設計する上での「抽象化」について説明してください。

[設問8]ポリモフィズムの説明と利用するケースやそのメリットを説明してください。