抽象クラスとは?、と聞かれた時の対応
時々、「抽象クラスとは何か説明してください」と面接で質問することがあります。得意言語はJavaです、と言う人に使う質問です。Javaというのはプログラミング言語として洗練されていると思っています。なので、はっきり言うと言語的なところで聞くことがあまりありません。他のプログラミング言語だと、はまる要因となる構文規則や変なライブラリとかあって、あれは困ったとか、バッドノウハウの知見などで話が盛り上がれます。そういう話をしていれば相手の力量もおのずと分かります。Javaはこの手の話が相対的に少ないのです。ジェネリックスで new T() みたいに書けないのがけしからん、と愚痴を言う人もいますが、初めから無いと思えば関係無いですし、Javaしか知らない人からは出てこない話です。
かと言って、java.util.Listに要素を追加するメソッド名はなんですか、とは聞きません。メソッド名を覚えていることは、どうでもいいことだからです。==とequalsの違いを答えてくださいという質問も、さすがに程度が低すぎて聞く気になれません。
そんなわけで、「抽象クラスとは何ですか」や「抽象クラスをなぜ使いますか」ぐらいでも聞いておくか、となります。ひとつの正解があるわけではないですが、以下ぐらいの回答が返ってくることを期待しています。
抽象(abstract)そのものの直截的な意味は、インスタンス化(具象化)をしない、という意味です。ただし、(privateコンストラクタで)インスタンス化を禁止するようなクラスと違い、抽象クラス自体はなんらかの具象クラスの抽象基底クラスとして、間接的にインスタンス化に寄与します。抽象基底クラスの使いどころは、ボトムアップ的な視点とトップダウン的な視点で説明できます。ボトムアップ的には、複数のクラスの共通処理をくくりだせます。トップダウン的には、いわゆるテンプレートメソッドパターン的に、処理の枠組や変わらない処理のみを抽象基底クラスにまとめ、具象な処理、固有な処理、変わりやすい処理を下位クラスに追い出せます。
もっと良い答えはいくらでも作れるでしょうが、面接の場でこのぐらい答えてくれれば、もう少し細かい部分に質問を進められます。
いわゆるポリモーフィズム(多態)のことを言及していませんが、個人的には、Javaで多態の役割を担っているのはインターフェースの方だと思っているのではずしました。そこまでインターフェース原理主義になる必要はない、と反論されれば、それはそうです、と返します。抽象クラスの質問に対して多態を答えてくれてもまったく問題ありません。その場合、そっち方面に話が移ります。結局のところ、抽象クラスの質問は次への質問のきっかけ作りのためだからです。
質問をだしておいてなんですが、抽象クラスを説明できることがそんなに重要だとは思っていません。答えられなくても、自分の中にある感覚を説明しようとする態度があれば良い印象を持ちます。しかし、本に書いてあった説明を思い出して答えるような態度には良い印象を持ちません。
汎化という言葉を知らなくても、共通したコードをまとめる感覚があることの方が大事です。テンプレートメソッドパターンという言葉を知ることもよりも、具象な処理や変わりやすい処理を外に追い出す感覚を持つことの方が大事です。追い出す感覚があれば、追い出し方は継承である必要もありません。委譲で追い出してもいいわけです(これをデザインパターンで何と呼ぶか、と質問するかもしれませんが、正直、答えられても答えられなくてもあまり気にしません)。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/q-abstract-class/tbping