リモコンで考えたいオブジェクト指向

2018/12/25

ごめんなさい初心者向けじゃないんです

取り急ぎ,書きたいことから書いていくのです.したがって,オブジェクト指向のいろんな用語とか,プログラミングの基礎知識があること前提.

皆さんは次のようなコードを現実で例えるとき,どのようにしますか?

Television obj = new SharpTelevision();

このコードで,SharpTelevisionはTelevisionを継承しているとします.

まず気になるのは,右辺のnewですね.これはSharpTelevision型のインスタンスを生成し,その参照を返すはずです.プログラムチョットワカラナイって言う人は,多分,objはTelevision型なのになんでSharpTelevision型の参照が代入できるのか意味わからんと思うのです.意味がわかる人は,これはアップキャストだから,と言うことではなくこの概念を人に教えるとしたらどうしようか考えてみてください.

オブジェクトを保持する変数はリモコン

…って強引に解釈することにしてみましょう.少なくとも今後,その方針でオブジェクト指向を教える教材を書きたいんです.

こう言う風に解釈するとすると,objと言う変数は,”Televisionのリモコン”なんです.そしてobj = new SharpTelevision()と言う操作は,新しく作ったオブジェクトをリモコンに登録すると言う事になるんです.新しく作ったオブジェクトは,メモリ空間のどこかに構築されていますから,そのオブジェクトを操作するにはリモコンを使わないといけないんです.


現実世界で,一般的なテレビのリモコンってどうなっていますか? だいたい最近のテレビだと,チャンネルボタンが1-12であって,音量と選局ボタン,番組表ボタン,十字と決定なんかがあったりすると思うんです.これって大概どのメーカーでも一緒ですよね.

でも,おそらくお手元にあるリモコンは”Televisonのリモコン”じゃなくて,どこかのメーカーの"xxxxTelevisonのリモコン"だと思います.そうすると,そのメーカーによって搭載されている機能が違いますから,リモコンのボタンも異なるはずです.

xxxxTelevisionオブジェクトは,もちろんxxxxTelevisionのリモコンで操作ができます.けれど,Televisionのリモコン(要は汎用リモコン)でも,ある程度の機能は操作ができますよね.上のコードは,objと言うリモコンでSharpTelevisionの全ての機能を使うことはできないかもしれませんが,チャンネル操作とか音量操作とか,そういったことは,obj.changeChannel(channelID)とかobj.increaseVolume()とかみたいにできるんです.

これを基にすればクラスベースでもプロトタイプベースでも結構説明できる

まず,なんの説明がしやすいかと言うと,多態性(ポリモフィズム)です.さっきまでの説明で行くと,obj.changeChannel(channelID)ってテレビによって動作が違いますよね.なんの表示もなくチャンネルが切り替わるテレビもあれば,チャンネル番号と番組名がちょっと表示されてからチャンネルが切り替わるテレビもあります.同じリモコンのはずなのに,得られる動作が違いますよね.

それから,インターフェースという概念の説明もつきやすくなります.インターフェースはリモコンにこういうボタンがある,というところだけを定義し,オブジェクトそのものの動作などは定義しません.

ここまではクラスベースのお話ですが,プロトタイプベースもなんとかなります.リモコンがスマートフォンに切り替わります.繋がった先のオブジェクトによって,スマホのアプリ(リモコンでいうところのボタン)一覧が切り替わるのです.存在しないメンバやメソッドにアクセスしようとすると,「そんなアプリないじゃん(undefined)」ってmain君が困っちゃうんですね.

草案だけまとめました

そのうち,このアイデアを基にちゃんと一から説明する資料を作りたい.